GLSL 内置函数

sqrt()

返回 x 的平方根。作用在 0.0 到 1.0 之间时,会抬高低端:先快速上升,再逐渐变平。

函数签名

float sqrt(float x)
vec2 sqrt(vec2 x)
vec3 sqrt(vec3 x)
vec4 sqrt(vec4 x)

参数

x
要开平方根的数,必须大于等于 0。

返回值

x 的平方根,类型与 x 相同。

在线示例

修改右侧代码,左侧预览会实时更新。

工作原理

sqrt(x) 是自己乘自己等于 x 的那个数:sqrt(0.25) 是 0.5。

在 shader 里它常出现在几何计算中。单位球满足 x*x + y*y + z*z = 1,所以球面在某个像素上方的高度是 z = sqrt(1.0 - x*x - y*y)。示例用这个高度构造表面法线,不需要任何 3D 模型就能画出一个受光照的球。

在 0 到 1 范围内,sqrt(x) 和 pow(x, 0.5) 一样:小的值被抬高很多,大的值只抬高一点。

常见用法

  • 假的球体:用上面的高度公式。
  • 距离:length(v) 就是 sqrt(dot(v, v))。只需要比较远近时,直接比较平方值 dot(v, v),可以省掉 sqrt。
  • 提亮暗部渐变:sqrt(t) 让斜坡的暗部更亮。

常见错误

  • 对负数开方。sqrt(-0.01) 未定义,通常是 NaN,会在图形边缘出现黑点。要加保护:sqrt(max(x, 0.0))。
  • 不需要时也调用 sqrt。length(p) < r 等价于 dot(p, p) < r * r,后者完全不用开方。

相关函数

用到 sqrt() 的教程