Shader 内置函数记录,特指可在 Unity3D 中使用的,且个人测试使用过的。

# 数学函数

函数说明
abs(x)返回 x 的绝对值
ceil(x)向上取整,返回不小于 x 的最小整数
lerp(a,b,f)线性插值:(1f)×a+b×f(1 – f )\times a + b \times f,其中 f 可以是标量,也可以是与 a 和 b 类型相同的向量。
smoothstep(min,max,x)返回 min 到 max 的平滑变化值,x 值范围需求 0~1;公式:2×(((xmin)(maxmin)))3+3×(((xmin)(maxmin)))2-2\times(\frac{((x-min)}{(max-min))})^3+3\times(\frac{((x-min)}{(max-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)xyx^y
sqrt(x)返回 x 的平方根,x 必须大于 0
rsqrt(x)返回 x 的倒数平方根(1sqrt(x)\frac 1 {sqrt(x)}),x 必须大于 0
exp(x)返回指数函数 exe^x
exp2(x)返回指数函数 2x^x
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 的双曲正弦,返回值范围为 [,+-\infty,+\infty]
cosh(x)取 x 的双曲余弦,返回值范围为 [1,++\infty]
tanh(x)取 x 的双曲正切,返回值范围为 [-1,+1];有公式:tanh(x)=sinh(x)cosh(x)=exexex+ex[:(sinh(x)exex)(cosh(x)ex+ex)]tanh(x)=\frac{sinh(x)}{cosh(x)}=\frac{e^x-e^{-x}}{e^x+e^{-x}} [注:(sinh(x)\neq{e^x-e^{-x}}) (cosh(x)\neq{e^x+e^{-x}})]
asin(x)取 x 的反正弦,返回值范围为[π2,π2-\frac\pi2, \frac\pi2],传入的 x 值必须在 [–1, 1] 范围内
acos(x)取 x 的反余弦,返回值范围为 [0, π\pi],传入的 x 值必须在 [–1, 1] 范围内
atan(x)取 x 的反正切,返回值范围为[π2,π2-\frac\pi2, \frac\pi2]
atan2(y,x)取 y/x 的反正切,返回值范围为[π,π-\pi, \pi]
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×2nx\times2^n)
lit(NdotL,NdotH,m)计算环境光、漫射光和镜面光贡献的照明系数。返回值为四维向量:x 为环境光系数,总是为 1;y 为漫反射系数,如果 NdotL 小于 0 则为 0,否则为 NdotL;z 为镜面系数,如果 NdotL 或 NdotH 任一小于 0 则为 0,否则返回(NH)m(N \cdot H)^m
log(x)返回 x 的自然对数 (底为 e=2.71828...),x 必须大于 0 (注:对数函数有 y=logax(a>0a1)y=log _a x(a>0 且 a \neq 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)=[M11M21M31M41M12M22M32M42M13M23M33M43M14M24M34M44][M11M21M31M41M12M22M32M42M13M23M33M43M14M24M34M44]mul(M,N)= \begin{bmatrix} M_{11} & M_{21} & M_{31} & M_{41} \\ M_{12} & M_{22} & M_{32} & M_{42} \\ M_{13} & M_{23} & M_{33} & M_{43} \\ M_{14} & M_{24} & M_{34} & M_{44} \\ \end{bmatrix} \begin{bmatrix} M_{11} & M_{21} & M_{31} & M_{41} \\ M_{12} & M_{22} & M_{32} & M_{42} \\ M_{13} & M_{23} & M_{33} & M_{43} \\ M_{14} & M_{24} & M_{34} & M_{44} \\ \end{bmatrix}

  • mul (M,v):矩阵 M 和向量 v 的乘积,如果 M 是 AxB 矩阵,v 是 Bx1 向量,则返回 Ax1 向量。

mul(M,v)=[M11M21M31M41M12M22M32M42M13M23M33M43M14M24M34M44][v1v2v3v4]mul(M,v)= \begin{bmatrix} M_{11} & M_{21} & M_{31} & M_{41} \\ M_{12} & M_{22} & M_{32} & M_{42} \\ M_{13} & M_{23} & M_{33} & M_{43} \\ M_{14} & M_{24} & M_{34} & M_{44} \\ \end{bmatrix} \begin{bmatrix} v_{1} \\ v_{2} \\ v_{3} \\ v_{4} \\ \end{bmatrix}

  • mul (v,M):行向量 v 和矩阵 M 的乘积,如果 v 是 1xA 向量,M 是 AxB 矩阵,则返回 1xB 向量。

mul(v,M)=[v1v2v3v4][M11M21M31M41M12M22M32M42M13M23M33M43M14M24M34M44]mul(v,M)= \begin{bmatrix} v_{1} & v_{2} & v_{3} & v_{4} \\ \end{bmatrix} \begin{bmatrix} M_{11} & M_{21} & M_{31} & M_{41} \\ M_{12} & M_{22} & M_{32} & M_{42} \\ M_{13} & M_{23} & M_{33} & M_{43} \\ M_{14} & M_{24} & M_{34} & M_{44} \\ \end{bmatrix}

# 几何函数

函数说明
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