Unity Shader 常用函数列表
发表于2017-11-04
CG 标准函数库
和 C 的标准函数库类似,Cg 提供了一系列内建的标准函数。这些函数用于执行数学上的通用计算或通用算法(纹理映射等),例如,需要求取入射光线的反射光线方向向量可以使用标准函数库中的 reflect 函数,求取折射光线方向向量可以使用 refract 函数,做矩阵乘法运算时可以使用 mul 函数。
有些函数直接和 GPU 指令相对应,所以执行效率非常高。绝大部分标准函数都被重载过,用于支持不同长度的数组和向量作为输入参数。
和 C 的标准函数库类似,Cg 提供了一系列内建的标准函数。这些函数用于执行数学上的通用计算或通用算法(纹理映射等),例如,需要求取入射光线的反射光线方向向量可以使用标准函数库中的 reflect 函数,求取折射光线方向向量可以使用 refract 函数,做矩阵乘法运算时可以使用 mul 函数。
有些函数直接和 GPU 指令相对应,所以执行效率非常高。绝大部分标准函数都被重载过,用于支持不同长度的数组和向量作为输入参数。
Cg 标准函数会随着未来 GPU 硬件的发展而不断优化,所以基于标准函数库写的程序是可以用在以后的 GPU 硬件上的。 Cg 标准函数库主要分为五个部分:
数学函数(Mathematical Functions);
几何函数(Geometric Functions);
纹理映射函数(Texture Map Functions)
偏导数函数(Derivative Functions);
调试函数(Debugging Function)
数学函数(Mathematical Functions)
数学函数用于执行数学上常用计算,包括:三角函数、幂函数、园函数、向量和矩阵的操作函数。这些函数都被重载,以支持标量数据和不同长度的向量作为输入参数。
函数 功能
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]
osh(x) 双曲余弦(hyperbolic cosine)函数,计算 x 的双曲余弦值
cross(A,B) 返回两个三元向量的叉积(cross product)。注意,输入参数必须是三元向量
degrees(x) 输入参数为弧度值(radians),函数将其转换为角度值(degrees)
determinant(m) 计算矩阵的行列式因子
dot(A,B) 返回 A 和 B 的点积(dot product)
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<a,返回 0;否则,返回 1。 |
sqrt(x) | 求 x 的平方根, x ,x 必须大于 0。 |
tan(x) | 输入参数为弧度,计算正切值 |
tanh(x) | 计算双曲正切值 |
transpose(M) | M 为矩阵,计算其转置矩阵 |
几何函数(Geometric Functions)
Cg 语言标准函数库中有3 个几何函数会经常被使用到,分别是:normalize 函数,对向量进行归一化;reflect 函数,计算反射光方向向量;refract 函数,计算折射光方向向量。注意:
1 着色程序中的向量 好进行归一化之后再使用,否则会出现难以预料的错误;
2 reflect 函数和 refract 函数都存在以“入射光方向向量”作为输入参数,注意这两个函数中使用的入射光方向向量,是从外指向几何顶点的;平时我们在着色程序中或者在课本上都是将入射光方向向量作为从顶点出发。
s 象征一元、二元、三元纹理坐标;z 代表使用“深度比较(depth comparison)” 的值;q 表示一个透视值(perspective value,其实就是透视投影后所得到的齐次坐标的 后一位),这个值被用来除以纹理坐标(S),得到新的纹理坐标(已归一化到 0 和 1 之间)然后用于纹理查询。
1 着色程序中的向量 好进行归一化之后再使用,否则会出现难以预料的错误;
2 reflect 函数和 refract 函数都存在以“入射光方向向量”作为输入参数,注意这两个函数中使用的入射光方向向量,是从外指向几何顶点的;平时我们在着色程序中或者在课本上都是将入射光方向向量作为从顶点出发。
函数 | 功能 |
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 是指向顶点的;函数只对三元向量有效 |
s 象征一元、二元、三元纹理坐标;z 代表使用“深度比较(depth comparison)” 的值;q 表示一个透视值(perspective value,其实就是透视投影后所得到的齐次坐标的 后一位),这个值被用来除以纹理坐标(S),得到新的纹理坐标(已归一化到 0 和 1 之间)然后用于纹理查询。
纹理函数非常多,总的来说,按照纹理维数进行分类,即:1D 纹理函数, 2D 纹理函数,3D 纹理函数,已经立方体纹理。需要注意,TexREC 函数查询的纹理实际上也是二维纹理。 3D 纹理,另一个比较学术化的名称是“体纹理(Volume Texture)”,体纹理通常用于体绘制,体纹理用于记录空间中的体细节数据。
还有一类较为特殊的纹理查询函数以 proj 结尾,主要是针对投影纹理进行查询。所谓投影纹理是指:将纹理当做一张幻灯片投影到场景中,使用投影纹理技术需要计算投影纹理坐标,然后使用投影纹理坐标进行查询。使用投影纹理坐标进行查询的函数就是投影纹理查询函数。 本质来说,投影纹理查询函数和普通的纹理查询函数没有什么不同,唯一的区别在于“投影纹理查询函数使用计算得到的投影纹理坐标,并在使用之前会将该投影纹理坐标除以透视值”。举例而言,计算得到的投影纹理坐标为 float4 uvproj,使用二维投影纹理查询函数:
tex2Dproj(texture,uvproj); 等价于按如下方法使用普通二维纹理查询函数:
float4 uvproj = uvproj/uvproj.q; tex2D(texture,uvproj);
偏导函数(Derivative Functions)
|