Shader 内置函数记录,特指可在 Unity3D 中使用的,且个人测试使用过的。
# 数学函数
函数 | 说明 |
---|
abs(x) | 返回 x 的绝对值 |
ceil(x) | 向上取整,返回不小于 x 的最小整数 |
lerp(a,b,f) | 线性插值:(1–f)×a+b×f,其中 f 可以是标量,也可以是与 a 和 b 类型相同的向量。 |
smoothstep(min,max,x) | 返回 min 到 max 的平滑变化值,x 值范围需求 0~1;公式:−2×((max−min))((x−min))3+3×((max−min))((x−min))2 |
step(a,x) | x>=a?1:0 |
floor(x) | 向下取整,返回不大于 x 的最大整数 |
max(a,b) | 返回 a、b 中最大值 |
min(a,b) | 返回 a、b 中最小值 |
round(x) | 返回 x 的四舍五入值 |
clamp(x,a,b) | 将 x 限制在 a~b 范围内;若 x 在 a、b 范围内则返回 x,若 x 小于 a 则返回 a,若 x 大于 b 则返回 b |
saturate(x) | 将 x 值限制在 [0,1] 范围内 |
frac(x) | 取 x 的小数位部分 |
sign(x) | 若 x>0 则返回 1,若 x<0 则返回 - 1,否则返回 0 |
modf(x,ip[out]) | 将 x 拆分为小数和整数两部分,返回小数,并将整数部分赋值于 ip |
cross(A,B) | 返回向量 A 与 B 的叉积,A 与 B 必须为三维向量 |
dot(A,B) | 返回向量 A 与 B 的点积 |
fmod(x,y) | 返回 x 除以 y 的余数 |
pow(x,y) | xy |
sqrt(x) | 返回 x 的平方根,x 必须大于 0 |
rsqrt(x) | 返回 x 的倒数平方根(sqrt(x)1),x 必须大于 0 |
exp(x) | 返回指数函数 ex |
exp2(x) | 返回指数函数 2x |
all(x) | 如果 x 的每个值都不为 0,则返回 true,否则返回 false (可当做 1、0) |
any(x) | 只要 x 有一个值不为 0,就返回 true,否则返回 false |
sin(x) | 取 x 的正弦,返回值范围为 [-1,1] |
cos(x) | 取 x 的余弦,返回值范围为 [-1,1] |
sincos(float x,s[out],c[out]) | 返回 x 的,s:正弦、c:余弦;适用于需要同时计算 sin、cos 的情况,性能比单独计算更好 |
tan(x) | 取 x 的正切 |
sinh(x) | 取 x 的双曲正弦,返回值范围为 [−∞,+∞] |
cosh(x) | 取 x 的双曲余弦,返回值范围为 [1,+∞] |
tanh(x) | 取 x 的双曲正切,返回值范围为 [-1,+1];有公式:tanh(x)=cosh(x)sinh(x)=ex+e−xex−e−x[注:(sinh(x)=ex−e−x)(cosh(x)=ex+e−x)] |
asin(x) | 取 x 的反正弦,返回值范围为[−2π,2π],传入的 x 值必须在 [–1, 1] 范围内 |
acos(x) | 取 x 的反余弦,返回值范围为 [0, π],传入的 x 值必须在 [–1, 1] 范围内 |
atan(x) | 取 x 的反正切,返回值范围为[−2π,2π] |
atan2(y,x) | 取 y/x 的反正切,返回值范围为[−π,π] |
degrees(x) | 将作为弧度值的 x 转换为角度 |
radians(x) | 将作为角度值的 x 转换为弧度 |
determinant(M) | 取矩阵 M 的行列式(返回似乎是行列式的一个值,可当 float 用) |
frexp(x,exp[out]) | 把 x 分解成尾数和指数。返回值是尾数,并将指数存入 exp 中。所得的值是 x = 尾数 * 2 ^ exp。参考 |
isfinite(x) | 如果 x 值有限,返回 true |
isinf(x) | 如果 x 值无限,返回 true |
isnan(x) | 如果 x 不是数字,返回 true |
ldexp(x,n) | 返回 x 乘以 2 的 n 次幂 (x×2n) |
lit(NdotL,NdotH,m) | 计算环境光、漫射光和镜面光贡献的照明系数。返回值为四维向量:x 为环境光系数,总是为 1;y 为漫反射系数,如果 NdotL 小于 0 则为 0,否则为 NdotL;z 为镜面系数,如果 NdotL 或 NdotH 任一小于 0 则为 0,否则返回(N⋅H)m |
log(x) | 返回 x 的自然对数 (底为 e=2.71828...),x 必须大于 0 (注:对数函数有 y=logax(a>0且a=1)) |
log2(x) | 返回底为 2 的 x 的对数,x 必须大于 0 |
log10(x) | 返回 x 的常用对数 (底为 10),x 必须大于 0 |
# 矩阵运算
transpose (M):返回矩阵 M 的转置矩阵,如果 M 是 AxB 矩阵,则 M 的转置矩阵是 BxA 矩阵,其第一列是 M 的第一行,第二列是 M 的第二列,第三列是 M 的第三行,等等。
mul (M,N):矩阵 M 和矩阵 N 的矩阵积,如果 M 的大小为 AxB,而 N 的大小为 BxC,则返回一个大小为 AxC 的矩阵。
mul(M,N)=⎣⎢⎢⎢⎡M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44⎦⎥⎥⎥⎤
- mul (M,v):矩阵 M 和向量 v 的乘积,如果 M 是 AxB 矩阵,v 是 Bx1 向量,则返回 Ax1 向量。
mul(M,v)=⎣⎢⎢⎢⎡M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡v1v2v3v4⎦⎥⎥⎥⎤
- mul (v,M):行向量 v 和矩阵 M 的乘积,如果 v 是 1xA 向量,M 是 AxB 矩阵,则返回 1xB 向量。
mul(v,M)=[v1v2v3v4]⎣⎢⎢⎢⎡M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44⎦⎥⎥⎥⎤
# 几何函数
函数 | 说明 |
---|
distance(point1,point2) | 计算点 point1 与点 point2 之间的欧几里德距离 |
faceforward(N,I,Ng) | 如果 dot (Ng,I)<0 则返回 N,否则返回 - N |
length(v) | 返回向量 v 的长度 |
normalize(v) | 对向量 v 进行归一化,仅保留方向 |
reflect(I,N) | 由进入射线方向 I 和表面法线 N 计算反射矢量 (仅对三维向量有效) |
refract(I,N,eta) | 给定入射线方向 I、法线 N 和折射系数 eta,计算折射矢量;如果 I 和 N 之间的角度对于给定的 eta 来说太大,则返回 (0,0,0) (仅对三维向量有效,折射系数:一般定值,可直接通过搜索获取对应数据表) |
# 纹理相关函数
函数 | 说明 |
---|
tex2D(sampler2D tex,float2 uv) | 二维纹理查询 |
tex2D(sampler2D tex,float2 s,float2 dsdx,float2 dsdy) | 二维纹理查询,带导数,有点糊 |
tex2D(sampler2D tex,float3 sz) | 二维纹理查询,带深度,普通图片没效果 |
tex2D(sampler2D tex,float3 sz,float2 dsdx ,float2 dsdy) | 二维纹理查询,带导数,带深度 |
tex2Dproj(sampler2D tex , float4 szq) | 二维投影纹理查询,跟 tex2D 差不多,只是会在对纹理采样前除以 w 分量 (例如 GrabPass 测试,Unity 中 tex2D (_MyGrabTexture,i.uv) 与 tex2Dproj (_MyGrab,float4 (i.uv,0,1)) 结果表现是一致的) |
tex3D(sampler3D tex,float3 s) | 三维纹理查询 示例 |
tex3D(sampler3D tex,float3 s,float3 dsdx,float3 dsdy) | 三维纹理查询,带导数 |
texCUBE(samplerCUBE tex,float3 s) | 立方体纹理查询 |
texCUBE(samplerCUBE tex,float3 s,float3 dsdx,float3 dsdy) | 立方体纹理查询,带导数 |
# 导数函数
函数 | 说明 |
---|
ddx(a) | 返回指定值相对于屏幕空间 x 坐标的偏导数 |
ddy(a) | 返回指定值相对于屏幕空间 y 坐标的偏导数 |
# 特殊
函数 | 说明 |
---|
discard | 片元程序使用,丢弃当前像素(会导致 Early-Z 无效) |
clip(a) | 片元程序使用,若 a 小于 0 则丢弃当前像素(会导致 Early-Z 无效) |
noise | 无效,不过 noise 可通过 float noise = frac (sin (dot (v.uv.xy, float2 (12.9898, 78.233))) * 43758.5453) 进行 trick |
参考文档:CgTutorial