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 编辑整理,如需转载,请注明出处。