音乐可视化
Audio Visualization

你将学到什么
- THREE.AudioAnalyser 读取 FFT 频谱
- 频谱均值驱动 uStrength uniform
- Simplex 4D Noise 沿法线顶点位移
customDepthMaterial同步修改保证阴影正确
效果说明
点击 Play 播放 MP3,高精度 IcosahedronGeometry 表面随节拍起伏,片元输出法线色形成「脉动球体」。
核心概念
音频链路
js
const listener = new THREE.AudioListener();
const audio = new THREE.Audio(listener);
const mediaElement = new Audio(url);
mediaElement.play();
audio.setMediaElementSource(mediaElement);
analyser = new THREE.AudioAnalyser(audio, 4096);频谱 → 强度
js
analyser.getFrequencyData();
let sum = 0;
for (let i = 0; i < analyser.data.length; i++) sum += analyser.data[i];
uniform.uStrength.value = sum / (analyser.data.length * 25.5);顶点噪声位移
在 onBeforeCompile 的 #include <fog_vertex> 后:
glsl
newPos += normal * simplexNoise4d(vec4(position, uTime)) * uStrength;
gl_Position = projectionMatrix * modelViewMatrix * vec4(newPos, 1.0);depthMaterial 同样注入,否则 shadow pass 与 color pass 几何不一致。
片元改为 gl_FragColor = vec4(vNormal, 1.),用法线 RGB 当可视化色。
实现步骤
- init 场景:高细分 Icosahedron + 地面 + 灯光阴影
- MeshStandardMaterial.onBeforeCompile 注入 GLSL
- createButton 绑定 Play/Pause
- tick 里 updateOffsetData + uTime + render
源码
完整源码见 GitHub。
小结
- 音频可视化核心:Analyser → uniform → shader 形变
- 下一篇:城市混合扫光
着色器 · Three.js · 3/89
