GLSL 内置函数
inversesqrt()
返回 1.0 / sqrt(x)。常用于向量归一化,以及随距离衰减的光照。
函数签名
float inversesqrt(float x)
vec2 inversesqrt(vec2 x)
vec3 inversesqrt(vec3 x)参数
- x
- 大于 0 的值。
返回值
1.0 / sqrt(x),类型与 x 相同。
在线示例
修改右侧代码,左侧预览会实时更新。
工作原理
inversesqrt(x) 一次调用就算出 1.0 / sqrt(x):inversesqrt(4.0) 是 0.5。
配合 dot(v, v)(长度的平方)使用,就得到 1.0 / length(v)。示例把它当作每盏灯的亮度:紧挨着灯非常亮,随距离缓慢变暗,于是出现了重叠处会叠加的柔和光球。
常见用法
- 手动归一化:
v * inversesqrt(dot(v, v))和normalize(v)完全一样。 - 光晕和衰减:
k * inversesqrt(dot(q, q))得到按 1 / 距离 衰减的光晕。
常见错误
- 传入 0 或负数。结果未定义,要加一个很小的数,比如
dot(q, q) + 1e-4。 - 只是为了性能才用它。现代 GPU 上
normalize和length都很快,哪个更易读就用哪个。