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,后者完全不用开方。