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)直接给出长度的平方,省掉开方。