Three.js 雨滴涟漪效果着色器

提示词

PROMPT
1
创建一个雨滴涟漪效果着色器,包含雨滴位置生成、单个涟漪、雨滴冲击和多雨滴涟漪系统,支持雨滴密度和涟漪速度调节。

效果描述

这是一个模拟雨滴落在水面产生涟漪的效果着色器,通过多雨滴涟漪系统创造逼真的雨滴涟漪效果。

效果特性

  • 雨滴位置生成:伪随机数生成雨滴位置
  • 单个涟漪:单个雨滴产生的涟漪
  • 雨滴冲击:雨滴冲击水面的效果
  • 多雨滴涟漪系统:多个雨滴的涟漪叠加
  • 水面波动:基础水面波动
  • 涟漪边缘发光:涟漪边缘的高光效果

参数调节

参数 默认值 范围 说明
雨滴密度 0.5 0.1-1.0 雨滴的数量密度
涟漪速度 1.0 0.3-3.0 涟漪传播的速度
波幅强度 0.3 0.1-0.8 涟漪的波幅强度
水面颜色 #4a90e2 - 水面的基础颜色

核心代码解析

雨滴位置生成器

GLSL
1
2
3
4
5
6
vec2 generateRaindropPosition(float seed) {
    // 使用伪随机数生成雨滴位置
    float x = fract(sin(seed * 78.233) * 43758.5453);
    float y = fract(sin(seed * 12.9898) * 43758.5453);
    return vec2(x, y);
}

单个涟漪效果

GLSL
1
2
3
4
5
6
7
8
9
10
11
float singleRipple(vec2 uv, vec2 center, float time, float speed) {
    float dist = distance(uv, center);
    
    // 涟漪传播效果
    float ripple = sin(dist * 20.0 - time * speed * 5.0);
    
    // 衰减效果
    float attenuation = 1.0 / (1.0 + dist * 10.0);
    
    return ripple * attenuation * waveAmplitude;
}

雨滴冲击效果

GLSL
1
2
3
4
5
6
7
8
9
float raindropImpact(vec2 uv, vec2 center, float time, float speed) {
    float dist = distance(uv, center);
    
    // 冲击波效果
    float impact = sin(dist * 30.0 - time * speed * 10.0) * 
                 exp(-dist * 15.0);
    
    return impact * 0.5;
}

多雨滴涟漪系统

GLSL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
float multiRippleSystem(vec2 uv, float time, float density) {
    float totalRipple = 0.0;
    int numDrops = int(density * 20.0);
    
    for (int i = 0; i < 15; i++) {
        if (i >= numDrops) break;
        
        float seed = float(i) * 123.456;
        vec2 dropPos = generateRaindropPosition(seed);
        
        // 每个雨滴的动画时间偏移
        float timeOffset = sin(seed * 45.678) * 10.0;
        
        // 单个涟漪
        float ripple = singleRipple(uv, dropPos, time + timeOffset, rippleSpeed);
        
        // 冲击效果
        float impact = raindropImpact(uv, dropPos, time + timeOffset, rippleSpeed);
        
        totalRipple += ripple + impact;
    }
    
    return totalRipple;
}

Uniforms

JAVASCRIPT
1
2
3
4
5
6
7
8
uniforms: {
    time: { value: 0 },
    resolution: { value: new THREE.Vector2(_width, _height) },
    dropDensity: { value: 0.5 },
    rippleSpeed: { value: 1.0 },
    waveAmplitude: { value: 0.3 },
    waterColor: { value: new THREE.Color(0x4a90e2) }
}

技术亮点

  1. 伪随机数:fract和sin生成随机位置
  2. 涟漪传播:sin函数模拟涟漪传播
  3. 衰减效果:1/(1+dist)实现距离衰减
  4. 多雨滴系统:最多15个雨滴的涟漪叠加
  5. 蓝色主题:#4a90e2营造水面氛围

调试技巧

  1. 雨滴密度:控制雨滴的数量
  2. 涟漪速度:影响涟漪传播的速度
  3. 波幅强度:影响涟漪的波幅
  4. 蓝色主题:适合水面效果
  5. 分辨率:128x128细分保证细节

扩展方向

  1. 真实雨滴:添加雨滴模型
  2. 雨景场景:添加雨景背景
  3. 水面反射:添加反射效果
  4. 雨声效果:添加雨声
  5. 暴风雨:添加暴风雨效果

本文档由 ThreeLab 编辑整理,如需转载,请注明出处。