GLSL 内置函数

length()

返回向量的长度,也就是它到原点的距离。length(p) 是画圆的起点。

函数签名

float length(float x)
float length(vec2 x)
float length(vec3 x)
float length(vec4 x)

参数

x
要测量长度的向量。

返回值

一个大于等于 0 的浮点数,即使传入的是向量也只返回一个数。

在线示例

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

工作原理

length(v) 用勾股定理测量向量有多长:length(vec2(3.0, 4.0)) 是 5.0,等于 sqrt(3.0 * 3.0 + 4.0 * 4.0)。

坐标 p 以中心为原点时,length(p) 就是像素到画布中心的距离。距离相同的像素连起来是一个圆,所以:

float d = length(p);
float circle = step(d, 0.5); // 在半径 0.5 的圆内为 1.0

示例还把距离交给 fract,让它重复成一圈圈向外扩散的圆环。

常见用法

  • 圆和圆环:把 length(p - center) 和半径比较。
  • 径向渐变和暗角:1.0 - length(p) 中间亮、边缘暗。
  • 圆的 SDF:length(p) - radius 在圆内为负、边上为 0、圆外为正。

常见错误

  • 没有把坐标移到中心。length(uv) 是从左下角开始量的,圆会只剩角落的一部分。
  • 画布不是正方形时圆被拉伸。先修正宽高比:p.x *= u_resolution.x / u_resolution.y。
  • 在循环里只是比较远近却用了 length。dot(v, v) 直接给出长度的平方,省掉开方。

相关函数

用到 length() 的教程