第9.2章:2D波纹扭曲着色器
波纹扭曲效果是2D游戏中常见的动态视觉效果,常用于水面扰动、魔法阵、冲击波等场景。本章将详细介绍如何实现各种波纹扭曲效果。
🎯 学习目标
- 理解波纹扭曲的数学原理
- 掌握径向和线性扭曲技术
- 学会创建动态波纹动画
- 理解多层波纹叠加效果
💡 波纹扭曲原理
数学基础
波纹扭曲通过修改UV坐标实现:
1 2 3 4
| float distance = length(uv - center); float wave = sin(distance * frequency - time * speed) * amplitude; vec2 distortedUV = uv + normalize(uv - center) * wave;
|
视觉效果分析
1
| 原始纹理 → 计算距离 → 生成波形 → UV偏移 → 扭曲效果 texture distance wave offset distorted
|
🔧 基础波纹效果
1. 简单径向波纹
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| CCEffect %{ techniques: - name: simple-ripple passes: - vert: ripple-vs:vert frag: ripple-fs:frag properties: &props mainTexture: { value: white } waveCenter: { value: [0.5, 0.5], editor: { type: vec2 } } waveAmplitude: { value: 0.02, range: [0, 0.1] } waveFrequency: { value: 10.0, range: [1, 50] } waveSpeed: { value: 5.0, range: [0, 20] } waveRange: { value: 0.5, range: [0.1, 2] } }%
CCProgram ripple-vs %{ precision highp float; #include <cc-global> in vec3 a_position; in vec2 a_texCoord; out vec2 v_uv; vec4 vert() { v_uv = a_texCoord; return cc_matViewProj * vec4(a_position, 1); } }%
CCProgram ripple-fs %{ precision highp float; #include <cc-global> uniform sampler2D mainTexture; uniform vec2 waveCenter; uniform float waveAmplitude; uniform float waveFrequency; uniform float waveSpeed; uniform float waveRange; in vec2 v_uv; vec4 frag() { vec2 uv = v_uv; float rangeFactor = 1.0 - smoothstep(0.0, waveRange, distance); float wave = sin(distance * waveFrequency - cc_time.x * waveSpeed) * waveAmplitude * rangeFactor; vec2 direction = normalize(uv - waveCenter); vec2 distortedUV = uv + direction * wave; vec4 color = texture(mainTexture, distortedUV); return color; } }%
|
📖 本章总结
通过本章学习,我们掌握了:
- ✅波纹扭曲的数学原理和实现
- ✅径向、线性、多重波纹技术
- ✅高级特效(热浪、冲击波、魔法阵)
- ✅TypeScript控制系统和性能优化
🚀 下一步学习
掌握2D波纹扭曲着色器后,建议继续学习:
👉 第9.3章:2D颜色替换着色器
💡 实践练习
- 创建一个石头投入水中的波纹效果
- 实现魔法法阵的动态扭曲
- 开发触摸屏幕产生冲击波的交互效果
系列导航