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.00.0625低位停留更久,然后急速上升
2.00.25缓慢起步
1.00.5直线
0.50.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 更清楚也更快。

相关函数

用到 pow() 的教程