
Three.js 算法噪声着色器效果 | 三维可视化 / AI 提示词
📋 AI 提示词
prompt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
使用 Three.js 实现**算法噪声着色器效果**,具体要求:
【核心特效】
- 四种噪声算法:白噪声、值噪声、柏林噪声、分形噪声
- 3D曲面可视化
- 可调的频率、强度、迭代次数
- 动态噪声动画
【场景与光照】
- 深蓝色背景 (#0a0a2a → #1a1a3a 径向渐变)
- OrbitControls 自由视角控制
- 自定义着色器实现噪声曲面
【交互与控制】
- OrbitControls 鼠标拖拽旋转
- 鼠标滚轮缩放
- GUI 面板切换噪声类型、调节参数
【技术要求】
- Three.js 版本 (ES Module)
- 自定义顶点着色器实现噪声曲面变形
- 自定义片元着色器实现颜色渐变
- lil-gui 参数控制
🖼️ 效果预览
🎮 案例演示
📖 效果拆解
| 层次 | 视觉效果 | 技术实现 |
|---|---|---|
| 基础 | 3D平面几何体 | PlaneGeometry (8×8, 256×256分段) |
| 核心特效 | 四种噪声算法 | 顶点着色器实现噪声计算和曲面变形 |
| 增强细节 | 颜色渐变 | 片元着色器根据噪声值插值颜色 |
| 交互控制 | 类型和参数调节 | GUI 控制噪声类型/频率/强度等 |
🔧 核心技术点
1. 白噪声函数
为什么需要这个技术:最简单的随机噪声,用于基础测试和特定效果。
glsl
1
2
3
float whiteNoise(vec2 p) {
return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
}
2. 值噪声函数
为什么需要这个技术:基于网格插值的平滑噪声,适合程序化纹理。
glsl
1
2
3
4
5
6
7
8
9
10
float valueNoise(vec2 p) {
vec2 i = floor(p);
vec2 f = fract(p);
float a = whiteNoise(i);
float b = whiteNoise(i + vec2(1.0, 0.0));
float c = whiteNoise(i + vec2(0.0, 1.0));
float d = whiteNoise(i + vec2(1.0, 1.0));
vec2 u = f * f * (3.0 - 2.0 * f);
return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;
}
3. 柏林噪声函数
为什么需要这个技术:最自然的梯度噪声,广泛用于地形、云层等自然纹理。
glsl
1
2
3
4
5
6
7
8
9
10
11
float perlinNoise(vec2 p) {
vec2 i = floor(p);
vec2 f = fract(p);
vec2 gradA = normalize(vec2(whiteNoise(i), whiteNoise(i + vec2(13.43, 61.21))) - 0.5);
vec2 gradB = normalize(vec2(whiteNoise(i + vec2(1.0, 0.0)), whiteNoise(i + vec2(14.43, 61.21))) - 0.5);
vec2 gradC = normalize(vec2(whiteNoise(i + vec2(0.0, 1.0)), whiteNoise(i + vec2(13.43, 62.21))) - 0.5);
vec2 gradD = normalize(vec2(whiteNoise(i + vec2(1.0, 1.0)), whiteNoise(i + vec2(14.43, 62.21))) - 0.5);
vec2 u = f * f * (3.0 - 2.0 * f);
return mix(mix(dot(gradA, f), dot(gradB, f - vec2(1.0, 0.0)), u.x),
mix(dot(gradC, f - vec2(0.0, 1.0)), dot(gradD, f - vec2(1.0, 1.0)), u.x), u.y) * 2.0;
}
4. 分形噪声函数
为什么需要这个技术:多层噪声叠加产生自然分形效果,适合地形和云层。
glsl
1
2
3
4
5
6
7
8
9
10
11
12
13
float fractalNoise(vec2 p, int octaves, float persistence) {
float total = 0.0;
float frequency = 1.0;
float amplitude = 1.0;
float maxValue = 0.0;
for(int i = 0; i < octaves; i++) {
total += perlinNoise(p * frequency) * amplitude;
maxValue += amplitude;
amplitude *= persistence;
frequency *= 2.0;
}
return total / maxValue;
}
5. 噪声类型选择
为什么需要这个技术:根据用户选择动态切换不同的噪声算法。
glsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uniform int uNoiseType;
void main() {
float noiseValue = 0.0;
if(uNoiseType == 0) {
noiseValue = whiteNoise(position.xy * 4.0 + uTime * 0.5);
} else if(uNoiseType == 1) {
noiseValue = valueNoise(position.xy * 2.0 + uTime * 0.3);
} else if(uNoiseType == 2) {
noiseValue = perlinNoise(position.xy * 3.0 + uTime * 0.2);
} else {
noiseValue = fractalNoise(position.xy * 2.0 + uTime * 0.1, 4, 0.5);
}
vec3 newPosition = position;
newPosition.z += noiseValue * uIntensity * 2.0;
gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0);
}
💡 调试与优化
| 问题类型 | 表现形式 | 解决方案 |
|---|---|---|
| 柏林噪声不平滑 | 曲面有棱角 | 增加网格分段数 |
| 分形噪声层次感差 | 各层区分不明显 | 调整 persistence 参数 |
| 性能问题 | 复杂场景帧率低 | 减少分形迭代次数 |
🚀 扩展思路
| 变体效果 | 核心改动 | 难度 |
|---|---|---|
| 地形生成 | 使用分形噪声生成3D地形 | ⭐⭐ |
| 云层渲染 | 使用分形噪声模拟体积云 | ⭐⭐⭐ |
| 水面效果 | 噪声驱动的动态水面 | ⭐⭐ |
| 大理石纹理 | 程序化生成大理石等材质 | ⭐⭐ |
| 噪声动画 | 添加风向参数实现流动效果 | ⭐⭐ |
本文档由 ThreeLab 编辑整理,如需转载,请注明出处。







京公网安备 11010502038735号
💬 评论区
评论功能即将上线,敬请期待!