GLSL 内置函数
pow()
返回 x 的 y 次幂。作用在 0.0 到 1.0 之间的值上时,会把一条直线斜坡弯成曲线。
函数签名
float pow(float x, float y)
vec2 pow(vec2 x, vec2 y)
vec3 pow(vec3 x, vec3 y)
vec4 pow(vec4 x, vec4 y)参数
- x
- 底数,必须大于等于 0。
- y
- 指数。大于 1.0 会把值压低,小于 1.0 会把值抬高。
返回值
x 的 y 次幂,类型与 x 相同。
在线示例
修改右侧代码,左侧预览会实时更新。
工作原理
输入在 0 到 1 之间时,pow 不会改变两端:pow(0.0, k) 是 0,pow(1.0, k) 是 1。它只改变中间的弯曲程度:
| 指数 | pow(0.5, k) | 效果 |
|---|---|---|
| 4.0 | 0.0625 | 低位停留更久,然后急速上升 |
| 2.0 | 0.25 | 缓慢起步 |
| 1.0 | 0.5 | 直线 |
| 0.5 | 0.707 | 很快上升,然后变平 |
示例让指数随时间变化,用绿线画出结果,灰线是作对比的直线 y = x。
常见用法
- 高光:
pow(max(dot(r, v), 0.0), 32.0),指数越大,高光越小越锐利。 - 菲涅尔边缘光:
pow(1.0 - dot(n, v), 5.0)让球体边缘发亮。 - 调整渐变和缓动:
pow(t, 2.0)让开头更慢。 - 伽马校正:
pow(color, vec3(1.0 / 2.2))。
常见错误
- 底数为负。
pow(-0.5, 2.0)在 GLSL 中未定义,常常返回 NaN(显示为黑色),尽管数学上答案是 0.25。改用x * x,或pow(abs(x), k)。 pow(0.0, 0.0),或底数为 0 而指数为负,同样未定义。- 在频繁执行的代码里写
pow(x, 2.0)。x * x更清楚也更快。