GLSL 内置函数手册
写 shader 时最常用的内置函数,每一个都用通俗的语言讲清楚它做什么、什么时候用、容易在哪里出错,并附一个可以直接修改的实时示例。
常用函数
abs()
float abs(float x)返回 x 的绝对值:负数变成正数,正数保持不变。sign()float sign(float x)x 为负数时返回 -1.0,为 0 时返回 0.0,为正数时返回 1.0。floor()float floor(float x)把 x 向下取整,得到不大于 x 的最大整数。ceil()float ceil(float x)把 x 向上取整,得到不小于 x 的最小整数。fract()float fract(float x)返回 x 的小数部分,等于 x - floor(x),结果总在 0.0 到 1.0 之间。mod()float mod(float x, float y)返回 x 对 y 取模的结果,等于 x - y * floor(x / y),即 x 除以 y 的余数。min()float min(float x, float y)返回 x 和 y 中较小的那个。传入向量时,逐个分量比较。max()float max(float x, float y)返回 x 和 y 中较大的那个。传入向量时,逐个分量比较。clamp()float clamp(float x, float minVal, float maxVal)把 x 限制在 minVal 和 maxVal 之间,等于 min(max(x, minVal), maxVal)。mix()float mix(float x, float y, float a)在 x 和 y 之间做线性插值:a 为 0.0 时返回 x,为 1.0 时返回 y,中间值按比例混合。step()float step(float edge, float x)x 小于 edge 时返回 0.0,否则返回 1.0。相当于在阈值处的一个硬开关。smoothstep()float smoothstep(float edge0, float edge1, float x)x 小于 edge0 时返回 0.0,大于 edge1 时返回 1.0,中间是一条平滑的 S 形曲线。三角与指数函数
radians()
float radians(float degrees)把角度从角度制换算成弧度制,sin、cos 等三角函数要求的正是弧度。degrees()float degrees(float radians)把角度从弧度制换算成角度制,方便用 45 度、90 度这样的数来思考。sin()float sin(float angle)返回弧度角的正弦值,是一条每 2 * PI 重复一次、始终在 -1.0 到 1.0 之间的平滑波形。cos()float cos(float angle)返回弧度角的余弦值:和 sin 是同一条波,只是提前了四分之一圈。tan()float tan(float angle)返回弧度角的正切值,即 sin / cos。在接近 90 度时会冲向无穷大。atan()float atan(float y, float x)返回正切值为 y / x 的弧度角。双参数形式 atan(y, x) 给出一个点绕原点的完整角度,范围是 -PI 到 PI。acos()float acos(float x)返回余弦值为 x 的弧度角。acos(dot(a, b)) 可以得到两个单位向量之间的夹角。pow()float pow(float x, float y)返回 x 的 y 次幂。作用在 0.0 到 1.0 之间的值上时,会把一条直线斜坡弯成曲线。sqrt()float sqrt(float x)返回 x 的平方根。作用在 0.0 到 1.0 之间时,会抬高低端:先快速上升,再逐渐变平。inversesqrt()float inversesqrt(float x)返回 1.0 / sqrt(x)。常用于向量归一化,以及随距离衰减的光照。exp()float exp(float x)返回 e(约 2.718)的 x 次幂。exp(-k * d) 是做光晕和雾效时最常用的平滑衰减。exp2()float exp2(float x)返回 2 的 x 次幂。适合每一级翻倍或减半的场景,比如噪声的倍频层和曝光档位。log()float log(float x)返回 x 的自然对数,是 exp 的反函数。它把乘法变成加法,可以用来做无限缩放效果。log2()float log2(float x)返回以 2 为底的对数:1.0 要翻倍几次才能得到 x。是 exp2 的反函数。几何函数
length()
float length(float x)返回向量的长度,也就是它到原点的距离。length(p) 是画圆的起点。distance()float distance(float p0, float p1)返回两个点之间的距离,等于 length(p0 - p1)。dot()float dot(vec2 x, vec2 y)返回两个向量的点积。对单位向量来说,它衡量两者方向有多一致:1.0 同向,0.0 垂直,-1.0 反向。normalize()vec2 normalize(vec2 x)返回与 x 方向相同、长度为 1.0 的向量。保留方向,丢掉大小。cross()vec3 cross(vec3 x, vec3 y)返回两个三维向量的叉积:一个同时垂直于两者的新向量。常用于构造法线和坐标系。reflect()vec2 reflect(vec2 I, vec2 N)返回光线照到表面后反弹的方向:reflect(I, N) = I - 2.0 * dot(N, I) * N。refract()vec2 refract(vec2 I, vec2 N, float eta)返回光线进入另一种材质后的折射方向,就像光进入玻璃或水时发生弯折。faceforward()vec3 faceforward(vec3 N, vec3 I, vec3 Nref)返回 N 或 -N 中与入射方向 I 相反的那个。让法线朝向观察者,用于双面光照。纹理与导数
想系统地学?
函数手册适合随时查阅。如果你刚开始学 GLSL,可以从学习路径的第一课开始,每课一个知识点,并附练习。
开始学习