基于 WebGL 的广义相对论黑洞吸积盘着色器实现
本文介绍了一种基于 WebGL(Three.js)技术实现的广义相对论着色器引擎,用于模拟黑洞吸积盘的视觉效果。
架构概览:CPU-GPU 混合计算
为了在保持物理交互性的同时实现数十万粒子的相对论视觉特效,采用分层架构:
| 层级 | 负责内容 | 数据类型 |
|---|---|---|
| CPU(JavaScript) | N-body 轨道积分、碰撞检测、吸积逻辑、粒子生命周期 | Float32Array |
| GPU(Vertex Shader) | 引力红移、多普勒效应、相对论集束、引力透镜、颜色混合 | attribute vec3 |
| GPU(Fragment Shader) | 纹理、光晕、像素合成 | gl_FragColor |
物理引擎实现(粒子系统)
实现了基础的多体运动 N-body 及洛希极限解体简化模型,采用半隐式欧拉积分以平衡稳定性和性能。为模拟红移,将粒子视为光子,计算其相对于摄像机的速度,远离时变红暗,靠近时变亮蓝(多普勒效应)。
// 伪代码:核心物理循环
for(let i = 0; i < particleCount; i++) {
// 1. 计算合力 (牛顿引力)
vec3 acc = calculateGravity(position[i], attractors);
// 2. 更新速度
velocity[i] += acc * dt;
// 3. 更新位置
position[i] += velocity[i] * dt;
// 4. 史瓦西半径检查 (视界吸收)
if(distance(position[i], blackhole) < SchwarzschildRadius * 1.05) {
respawnParticle(i); // 粒子落入黑洞,重置
}
}
虚实粒子渲染
通过一个真实的粒子运动推断四周粒子云的运动方式,减少计算数量以达到更多真实粒子效果。
系统架构
class ParticleManager {
// 三个核心缓冲区
positions = new Float32Array(maxCount * 3); // 位置 (虚拟)
velocities = new Float32Array(maxCount * 3);
colors = (maxCount * );
() {
.[idx] = pos. + r * .(phi) * .(theta);
}
}

