从 NeRF 到 3DGS:一场显式表示的逆袭
动态场景渲染总在速度和画质间摇摆。传统管线快但处理复杂光照时僵硬,物理渲染真实但跑不动实时。NeRF 用隐式神经表示惊艳了一把,可训练和推理的算力账单让人头疼。
3D Gaussian Splatting(3DGS)选择了更'粗暴'的方式:把场景拆成几百万个可优化的 3D 高斯。每个高斯自带位置、协方差、不透明度和球谐系数,然后通过可微 splatting 直接光栅化。这套显式表示的好处很实在。
RTX 3090 上跑 1080p 能稳定到 100 FPS 以上。各向异性滤波撑住了画质,球谐系数让外观能随着视角变化——不是漫反射那种简单照明,是真能模拟镜面高光的移动。当然,场景越复杂,高斯数量也越涨,不过主流程的优化还没到头。
class Gaussian3D:
def __init__(self):
self.position = [x, y, z] # 3D 位置
self.covariance = [[a,b,c],[d,e,f],[g,h,i]] # 协方差矩阵
self.opacity = 0.8 # 不透明度
self.sh_coeffs = [...] # 球谐系数 (视角相关外观)
代码结构看着简单,真正头疼的是管理这些高斯在时间轴上的变化。动态场景不能每帧重训,那等于扔掉了实时性。Kerbl 他们提出的持久性动态视图合成给出了解法:对高斯的位置和旋转做时序优化,再套上局部刚体约束,就能让高斯平滑地'活'起来。帧间的几何一致性保住了,闪烁伪影也压了下去。代价是预处理时得仔细标定运动区域,否则刚体约束会在非刚体区域引入拉扯失真。

