同心圆环

3 / 15
练习基于 UV 构建重复图案。

fract 把到中心的距离变成重复的圆环:

下面拆解原理。


先算距离

vUv - 0.5 把坐标原点从左下角移到画面中心。

length(p) 计算每个像素到中心的距离:中心为 0,边缘约 0.5–0.7。

这是一个以中心为起点、向外均匀增大的数值场。


fract 把距离变成圆环

d * 12.0 把 0–0.7 的距离范围扩展成 0–8.4。

fract() 把这段范围折叠成多段 0–1 的锯齿波,每一段对应一个圆环。

折叠次数越多(d 越大,离中心越远),圆环越密。


step 切出硬边

step(0.5, rings) 把每个环分成内半(0–0.5,返回 0)和外半(0.5–1.0,返回 1),形成双色交替的同心圆环。


试着改一改

改动效果
12.0 改为 6.0圆环变宽,数量减少
12.0 改为 24.0圆环变细,数量增多
step(0.5, rings) 改为 step(0.3, rings)深色环变窄,浅色环变宽
vUv - 0.5 改为 vUv - vec2(0.2, 0.7)圆环中心移到左上角

练习

float rings = 0.0; 改成正确的表达式,让画面出现以中心为圆心的同心圆环。

答案解析

d 是像素到中心的距离,d * 12.0 把距离范围放大 12 倍,fract() 把它折叠成重复的 0–1 波形,每折叠一次就产生一个圆环。

初始代码 rings = 0.0 让所有像素的 rings 恒为 0,step(0.5, 0.0) 恒为 0,画面全是深色。改成 fract(d * 12.0) 后,rings 随距离变化形成锯齿波,step 在每个周期内切出一对深/浅的圆环。

试着把 fract(d * 12.0) 改为 fract(d * d * 50.0),圆环间距会随距离变化,产生向外收缩的效果。

GLSL 代码编辑器

正确代码预览

当前代码预览