圆波扫光
Circle Wave Scan

你将学到什么
- circleWave 函数:同心圆径向扩散
fract(dist - t)形成 moving ring- AdditiveBlending 叠加发光
- 扫描纹理
wave.png调制遮罩
效果说明
水平放置的平面上,青色同心圆波从中心向外扩散,带 noise 纹理细节;dat.GUI 可调主色与暗部色。
核心概念
circleWave
glsl
float circleWave(vec3 p, vec3 origin, float distRatio) {
float t = uTime;
float dist = distance(p, origin) * distRatio;
float radialMove = fract(dist - t);
float fadeOutMask = 1.0 - smoothstep(1.0, 3.0, dist);
radialMove *= fadeOutMask;
float cutInitialMask = 1.0 - step(t, dist);
return radialMove * cutInitialMask;
}fract(dist - t):波环随时间外移cutInitialMask:未到达半径前不显示fadeOutMask:远处衰减
双层波 + 纹理
glsl
float cw = circleWave(worldPos, uScanOrigin, 3.2);
float cw2 = circleWave(worldPos, uScanOrigin, 2.8);
float scanMask = texture2D(uScanTex, uv).r;
vec3 scanCol = mix(uScanColorDark, uScanColor, mask1);
gl_FragColor = vec4(col, length(col)); // alpha 随亮度材质:transparent: true,blending: THREE.AdditiveBlending。
实现步骤
- PlaneGeometry + ShaderMaterial
- mesh.rotation.x = PI/2 水平铺地
- GUI 绑定 uScanColor / uScanColorDark
- uTime 每帧 += 0.005
源码
完整源码见 GitHub。
小结
着色器 · Three.js · 8/89
