今天给大家列出来shader中常用的一些函数,函数后面有释义,大家可以打印出来,或者在写shader的时候来这篇文章查阅,看看你需要用到哪些。
Cg提供了一系列内建的标准函数。这些函数用于执行数学上的通用计算或通用算法(纹理映射等), 有些函数直接和 GPU 指令相对应,所以执行效率非常高。
这些函数来源于文档,我为大家筛选出了常用的,去掉了基本用不到的函数。
数学函数:
abs(x)
返回输入参数的绝对值
acos(x)
反余切函数,输入参数范围为[-1,1],返回[0,π]区间的角度值
all(x)
如果输入参数均不为0,则返回 ture;否则返回 flase。&&运算
any(x)
输入参数只要有其中一个不为0,则返回 true。||运算
asin(x)
反正弦函数,输入参数取值区间为[−1,1],返回角度值范围为[−π/2 ,π/2 ]
atan(x)
反正切函数,返回角度值范围为⎡−π/2 ,π/2⎤
atan2(y,x)
计算y/x 的反正切值。实际上和atan(x)函数功能完全一样,至少输入参数不同。atan(x) = atan2(x, float(1))
ceil(x)
对输入参数向上取整。例如:ceil(float(1.3)),其返回值为 2.0
clamp(x,a,b)
如果x 值小于 a,则返回a;如果 x 值大于 b,返回b;否则,返回 x
cos(x)
返回弧度 x 的余弦值。返回值范围为[−1,1]
cross(A,B)
返回两个三元向量的叉积(cross product)。注意,输入参数必须是三元向量
degrees(x)
输入参数为弧度值(radians),函数将其转换为角度值(degrees)
determinant(m)
计算矩阵的行列式因子
dot(A,B)
返回A 和 B的点积(dot product)。参数A 和 B 可以是标量,也可以是向量(输入参数方面,点积和叉积函数有很大不同)
exp(x)
计算ex的值,e= 2.71828182845904523536
exp2(x)
计算2x的值
floor(x)
对输入参数向下取整。例如floor(float(1.3)) 返回的值为1.0;但是 floor(float(-1.3))返回的值为-2.0。
fmod(x,y)
返回x/y 的余数。如果 y 为 0,结果不可预料
frexp(x, out exp)
将浮点数 x 分解为尾数和指数,即x = m* 2^exp,返回m,并将指数存入 exp 中;如果 x 为 0,则尾数和指数都返回0
frac(x)
Returns the fractional portion of a scalar or each vector component
isfinite(x)
判断标量或者向量中的每个数据是否是有限数,如果是返回true;否则返回false;无限的或者非数据(not-a-number NaN)
isinf(x)
判断标量或者向量中的每个数据是否是无限,如果是返回 true;否则返回 false;
isnan(x)
判断标量或者向量中的每个数据是否是非数据(not-a-number NaN),如果是返回true;否则返回false;
ldexp(x, n)
计算x∗2n的值
lerp(a, b, f)
计算(1−f )∗ + ∗a b f或者a+f ∗ −(b a)的值。即在下限a 和上限 b 之间进行插值,f表示权值。注意,如果 a和 b 是向量,则权值 f必须是标量或者等长的向量。
lit(NdotL,NdotH, m)
N表示法向量;L 表示入射光向量;H表示半角向量;m 表示高光系数。函数计算环境光、散射光、镜面光的贡献,返回的 4元向量:
1.位表示环境光的贡献,总是 1.0;
2.位代表镜面光的贡献,如果 N •L<0,则为0;否则为 N •L;
3.位代表镜面光的贡献,如果N •L<0或者 N •H <0 ,则位 0;否则为(N •H)m;
W位始终位 1.0
log(x)
计算ln(x)的值,x必须大于 0
log2(x)
计算log(2x)的值,x 必须大于 0
log10(x)
计算log10(x)的值,x必须大于 0
max(a, b)
比较两个标量或等长向量元素,返回 大值
min(a,b)
比较两个标量或等长向量元素,返回 小值
step(a, x)
sqrt(x)
求 x的平方根, x ,x必须大于 0。
tan(x)
输入参数为弧度,计算正切值
transpose(M)
M 为矩阵,计算其转置矩阵
几何函数:
distance( pt1, pt2)
两点之间的欧几里德距离(Euclidean distance)
faceforward(N,I,Ng)
如果Ng I• <0 ,返回N;否则返回-N。
length(v)
返回一个向量的模,即 sqrt(dot(v,v))
normalize( v)
归一化向量
reflect(I, N)
根据入射光方向向量 I,和顶点法向量N,计算反射光方向向量。其中I和N 必须被归一化,需要非常注意的是,这个I 是指向顶点的;函数只对三元向量有效。
refract(I,N,eta)
计算折射向量,I为入射光线,N为法向量,eta为折射系数;其中 I 和N必须被归一化,如果I 和N 之间的夹角太大,则返回(0,0,0),也就是没有折射光线;I是指向顶点的;函数只对三元向量有效。
modf(x, out ip) |
|
mul(M, N) |
计算两个矩阵相乘,如果 M 为 AxB 阶矩阵,N 为 BxC阶矩阵,则返回 AxC 阶矩阵。下面两个函数为其重载函数。 |
mul(M, v) |
计算矩阵和向量相乘 |
mul(v, M) |
计算向量和矩阵相乘 |
noise( x) |
噪声函数,返回值始终在 0,1 之间;对于同样的输入,始终返回相同的值(也就是说,并不是真正意义上的随机噪声)。 |
pow(x, y) |
|
radians(x) |
函数将角度值转换为弧度值 |
round(x) |
Round-to-nearest,或 closest integer to x 即四舍五入 |
rsqrt(x) |
X 的反平方根,x 必须大于 0 |
saturate(x) |
如果 x 小于 0,返回 0;如果 x 大于 1,返回1;否则,返回 x |
sign(x) |
如果 x 大于 0,返回 1;如果 x 小于 0,返回01;否则返回 0。 |
sin(x) |
输入参数为弧度,计算正弦值,返回值范围为[−1,1] |
sincos(float x, out s, out c) |
该函数是同时计算 x 的 sin 值和 cos 值,其中s=sin(x),c=cos(x)。该函数用于“同时需要计算 sin 值和 cos 值的情况”,比分别运算要快很多! |
sinh(x) |
计算双曲正弦(hyperbolic sine)值。 |
smoothstep(min, max, x) |
值 x 位于 min、max 区间中。如果 x=min,返回 0;如果 x=max,返回 1;如果 x 在两者之间,按照下列公式返回数据: x−min x−min −2*( )3 +3*( )2 max−min max−min |
step(a, x) |
如果 x,返回 0;否则,返回 1。 |
sqrt(x) |
求 x 的平方根, x ,x 必须大于 0。 |
tan(x) |
输入参数为弧度,计算正切值 |
tanh(x) |
计算双曲正切值 |
transpose(M) |
M 为矩阵,计算其转置矩阵 |
函数 |
功能 |
distance( pt1, pt2) |
两点之间的欧几里德距离(Euclidean distance) |
faceforward(N,I,Ng) |
如果Ng I• < 0 ,返回 N;否则返回-N。 |
length(v) |
返回一个向量的模,即 sqrt(dot(v,v)) |
normalize( v) |
归一化向量 |
reflect(I, N) |
根据入射光方向向量 I,和顶点法向量 N,计算反射光方向向量。其中 I 和 N 必须被归一化,需要非常注意的是,这个 I 是指向顶点的;函数只对三元向量有效 |
refract(I,N,eta) |
计算折射向量,I 为入射光线,N 为法向量,eta 为折射系数;其中 I 和 N 必须被归一化,如果 I 和 N 之间的夹角太大,则返回(0,0,0),也就是没有折射光线;I 是指向顶点的;函数只对三元向量有效 |
函数 |
tex1D(sampler1D tex, float s) 一维纹理查询 |
tex1D(sampler1D tex, float s, float dsdx, float dsdy) 使用导数值(derivatives)查询一维纹理 |
Tex1D(sampler1D tex, float2 sz) 一维纹理查询,并进行深度值比较 |
Tex1D(sampler1D tex, float2 sz, float dsdx,float dsdy) 使用导数值(derivatives)查询一维纹理, 并进行深度值比较 |
Tex1Dproj(sampler1D tex, float2 sq) 一维投影纹理查询 |
Tex1Dproj(sampler1D tex, float3 szq) 一维投影纹理查询,并比较深度值 |
Tex2D(sampler2D tex, float2 s) 二维纹理查询 |
Tex2D(sampler2D tex, float2 s, float2 dsdx, float2 dsdy) 使用导数值(derivatives)查询二维纹理 |
Tex2D(sampler2D tex, float3 sz) 二维纹理查询,并进行深度值比较 |
Tex2D(sampler2D tex, float3 sz, float2 dsdx,float2 dsdy) 使用导数值(derivatives)查询二维纹理,并进行深度值比较 |
Tex2Dproj(sampler2D tex, float3 sq) 二维投影纹理查询 |
Tex2Dproj(sampler2D tex, float4 szq) 二维投影纹理查询,并进行深度值比较 |
texRECT(samplerRECT tex, float2 s) |
texRECT (samplerRECT tex, float2 s, float2 dsdx, float2 dsdy) |
texRECT (samplerRECT tex, float3 sz) |
texRECT (samplerRECT tex, float3 sz, float2 dsdx,float2 dsdy) |
texRECT proj(samplerRECT tex, float3 sq) |
texRECT proj(samplerRECT tex, float3 szq) |
Tex3D(sampler3D tex, float s) 三维纹理查询 |
Tex3D(sampler3D tex, float3 s, float3 dsdx, float3 dsdy) 结合导数值(derivatives)查询三维纹理 |
Tex3Dproj(sampler3D tex, float4 szq) 查询三维投影纹理,并进行深度值比较 |
texCUBE(samplerCUBE tex, float3 s) 查询立方体纹理 |
texCUBE (samplerCUBE tex, float3 s, float3 dsdx, float3 dsdy) 结合导数值(derivatives)查询立方体纹理 |
texCUBEproj (samplerCUBE tex, float4 sq) 查询投影立方体纹理 |
函数 |
功能 |
ddx(a) |
参数 a 对应一个像素位置,返回该像素值在 X 轴上的偏导数 |
ddy(a) |
参数 a 对应一个像素位置,返回该像素值在 X 轴上的偏导数 |