3dgs 代码详解
时间: 2025-07-08 18:46:32 浏览: 18
### 3D Gaussian Splatting 的代码实现详解
#### 1. 高斯分布的参数初始化
在 3D Gaussian Splatting 中,每个高斯分布都包含多个参数来描述其在三维空间中的属性。具体包括:
- **`self._xyz`**:表示 3D 高斯分布的中心位置(均值),用于确定高斯分布的空间位置。
- **`self._features_dc`**:第一个球谐系数,通常用于表示基础颜色信息。
- **`self._features_rest`**:其余的球谐系数,用于表示颜色细节和复杂光照效果。
- **`self._scaling`**:尺度参数,控制高斯分布的宽度,影响投影到屏幕上的大小。
- **`self._rotation`**:旋转参数,使用四元数表示高斯分布的方向。
- **`self._opacity`**:不透明度参数,控制高斯点的可见性。
- **`self.max_radii2D`**:在二维投影中,记录每个高斯分布的最大半径,用于渲染时控制其覆盖范围。
- **`self.xyz_gradient_accum`**:累积梯度信息,用于优化过程中调整高斯分布的中心位置。
- **`self.denom`**:可能用于归一化梯度计算。
- **`self.optimizer`**:优化器,负责更新上述参数以优化模型效果[^3]。
#### 2. 光栅化过程
光栅化是将 3D 高斯分布投影到屏幕并生成图像的过程。该步骤通过调用光栅化器函数完成:
```python
rendered_image, radii = rasterizer(
means3D=means3D,
means2D=means2D,
shs=shs,
colors_precomp=colors_precomp,
opacities=opacity,
scales=scales,
rotations=rotations,
cov3D_precomp=cov3D_precomp
)
```
- **`means3D`**:3D 高斯分布的中心位置。
- **`means2D`**:2D 投影后的中心位置。
- **`shs`**:球谐系数,用于颜色计算。
- **`colors_precomp`**:预计算的颜色值,如果提供了则直接使用。
- **`opacities`**:不透明度参数,控制每个高斯点的可见性。
- **`scales`**:尺度参数,控制高斯分布的扩展范围。
- **`rotations`**:旋转参数,控制高斯分布的方向。
- **`cov3D_precomp`**:预计算的协方差矩阵,用于加速计算。
此步骤会生成最终的渲染图像 `rendered_image` 和每个高斯分布在屏幕上的半径 `radii` [^1]。
#### 3. 密集化与修剪操作
为了提高渲染质量并减少不必要的计算资源消耗,3D Gaussian Splatting 引入了密集化与修剪操作。这一过程通过以下函数实现:
```python
def densify_and_prune(self, max_grad, min_opacity, extent, max_screen_size):
"""
对3D高斯分布进行密集化和修剪的操作
:param max_grad: 梯度的最大阈值,用于判断是否需要克隆或分割。
:param min_opacity: 不透明度的最小阈值,低于此值的3D高斯将被删除。
:param extent: 场景的尺寸范围,用于评估高斯分布的大小是否合适。
:param max_screen_size: 最大屏幕尺寸阈值,用于修剪过大的高斯分布。
"""
# 计算3D高斯中心的累积梯度并修正NaN值
grads = self.xyz_gradient_accum / self.denom
grads[grads.isnan()] = 0.0
# 根据梯度和尺寸阈值进行克隆或分割操作
self.densify_and_clone(grads, max_grad, extent)
self.densify_and_split(grads, max_grad, extent)
# 创建修剪掩码以删除不必要的3D高斯分布
prune_mask = (self.get_opacity < min_opacity).squeeze()
if max_screen_size:
big_points_vs = self.max_radii2D > max_screen_size
big_points_ws = self.get_scaling.max(dim=1).values > 0.1 * extent
prune_mask = torch.logical_or(torch.logical_or(prune_mask, big_points_vs), big_points_ws)
# 应用修剪掩码
self.prune_points(prune_mask)
# 清理CUDA缓存以释放资源
torch.cuda.empty_cache()
```
- **梯度计算**:通过 `xyz_gradient_accum` 和 `denom` 计算梯度,并处理可能出现的 NaN 值。
- **克隆与分割**:根据梯度和阈值对高斯分布进行克隆或分割,增加高斯分布的数量以提高渲染质量。
- **修剪操作**:根据不透明度、屏幕尺寸和场景范围创建修剪掩码,删除不必要的高斯分布。
- **CUDA 缓存清理**:释放 GPU 内存资源以避免内存溢出问题[^4]。
#### 4. CUDA 并行计算
3D Gaussian Splatting 利用 CUDA 进行高效计算,尤其是在光栅化和梯度计算过程中。Cooperative Groups 提供了细粒度的并行操作支持,使得大规模的并行计算成为可能。这种方式显著提高了渲染速度和模型训练效率[^2]。
#### 5. 球谐函数的应用
球谐函数(Spherical Harmonics, SH)在 3D Gaussian Splatting 中用于表示颜色信息。`_features_dc` 表示基础颜色,而 `_features_rest` 包含了更复杂的颜色细节和光照效果。这些球谐系数在渲染过程中会被用来计算每个像素的颜色值,从而实现高质量的光照和阴影效果。
---
阅读全文
相关推荐

















