🎯 提示词
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
使用 Three.js 实现【递归分形网格着色器】,具体要求:
【核心特效】
- 递归分形图案生成
- 动态色彩变化
- 指数衰减的距离场效果
【场景与光照】
- 网格辅助线
- 环境光照明
【交互与控制】
- OrbitControls 轨道控制器
【技术要求】
- Three.js 最新版本
- ShaderMaterial 自定义着色器
- 数学函数调色板
📖 效果拆解
| 层次 |
视觉效果 |
技术实现 |
| 基础 |
平面几何体 |
PlaneGeometry(10, 10, 100, 100) |
| 核心特效 |
递归分形 |
循环迭代UV坐标 |
| 增强细节 |
动态色彩 |
余弦调色板函数 |
| 背景 |
网格辅助 |
GridHelper |
🔧 核心技术点
1. 余弦调色板函数
使用余弦函数组合生成平滑的色彩渐变,这是 shader art 中常用的调色技术。
vec3 palette(float t){
vec3 a = vec3(0.5, 0.5, 0.5);
vec3 b = vec3(0.5, 0.5, 0.5);
vec3 c = vec3(1.0, 1.0, 1.0);
vec3 d = vec3(0.263, 0.416, 0.557);
return a + b * cos(PI * 2.0 * (c * t + d));
}
2. 递归分形距离场
通过迭代缩放UV坐标并计算距离场,生成复杂的分形图案。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vec4 mainImage(){
vec3 finalColor = vec3(0.0);
vec2 uuv = vUv * 2.0 - 1.0;
vec2 uv = vUv * 2.0 - 1.0;
for(float i = 0.0; i < 4.0; i++){
uv = fract(uv * 1.5) - 0.5;
float d = length(uv) * exp(-length(uuv));
vec3 col = palette(length(uuv) + i * 0.4 + iTime * 0.4);
d = sin(d * 8.0 + iTime) / 8.0;
d = abs(d);
d = pow(0.01 / d, 1.2);
finalColor += col * d;
}
return vec4(finalColor, 1.0);
}
3. 模块化架构
使用 ES6 class 封装 Three.js 应用逻辑,提高代码可维护性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Base {
constructor() {
this.init();
this.main();
}
init() {
this.clock = new THREE.Clock();
this.renderer = new THREE.WebGLRenderer({ antialias: true });
}
animate() {
this.controls.update();
this.renderer.render(this.scene, this.camera);
this.material.uniforms.iTime.value += 0.01;
}
}
💡 调试与优化
| 问题类型 |
表现形式 |
解决方案 |
| 分形图案重复 |
迭代次数不足 |
增加循环迭代次数 |
| 性能问题 |
复杂分形导致帧率下降 |
减少迭代次数或降低几何体细分 |
| 颜色过渡不自然 |
调色板参数不合适 |
调整 palette 函数中的 a/b/c/d 参数 |
| 边缘锯齿 |
图案边缘有明显锯齿 |
增加几何体细分或使用抗锯齿 |
🚀 扩展思路
| 变体效果 |
核心改动 |
难度 |
| 3D分形 |
将2D UV改为3D坐标,使用 raymarching |
⭐⭐⭐ |
| 自定义调色板 |
添加 GUI 控制调色板参数 |
⭐⭐ |
| 鼠标交互 |
添加鼠标位置影响分形图案 |
⭐⭐ |
| 模糊效果 |
添加高斯模糊后处理 |
⭐⭐⭐ |
本文档由 ThreeLab 编辑整理,如需转载,请注明出处。
💬 评论区
评论功能即将上线,敬请期待!