基于 WebGL(Three.js)技术实现的广义相对论着色器引擎
该引擎采用了一种新型的合成方式来实现真正近似黑洞吸积盘的效果。该引擎能够很好地体现在吸积盘高速旋转时产生的红移和蓝移效应。
这是一种极低成本得到最近似真实黑洞影响的一种实现方式。


图 1 是红移着色器开到最高的效果图,图 2 是没有开红移着色器的效果。现在的黑洞吸积盘是顺时针旋转的,能很明显的对比出红移的效果。另外还有一个较为极端的红移展示(这样子的吸积盘表现是因为设定时是一个漏斗形状的初始状态)。

效果展示的差不多了,我们来聊聊具体实现。
架构概览: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;
((position[i], blackhole) < * ) {
(i);
}
}

