场景表示、深度顺序与可见性
三角化输出十二个带颜色描述子的三维点,还不是完整场景。表示规定程序能够保存什么,渲染规定它如何产生图像,二者共同决定能被数据辨识的内容。一个点云可精确记录中心,却不提供连续表面或不透明轮廓;同一个点集可被解释为发光粒子、表面采样或体密度中心,得到不同画面。因此从点到图像必须先公开成像假设,不能仅给一个“场景”名称掩盖缺失结构。
点云是位置及附属属性的集合,容易从稀疏匹配得到;若直接画一个像素会有孔洞,需要点尺寸或重建表面的规则。三角网格额外给顶点之间的拓扑连接,并定义片内插值;边如何连接不是从无序点列表自动唯一决定。体素把空间切为格子,每格保存占据或密度;三维分辨率每轴翻倍,格子数约增八倍。连续隐式场则用函数查询坐标,仍需采样、等值面或体积分来形成可见输出。
不透明表面渲染沿每个像素射线只取最近交点。最小教学版本把点投到最近像素,深度缓冲初始为无穷,若当前深度更小就覆盖。这个规则是离散可见性,不模拟透明混合与阴影。项目独立实现并测试深度缓冲,以说明“远点不能盖过近点”的条件;主照片却由可加的发光 Gaussian 产生,二者不会被混称为同一渲染器。不同物理模型需分别验收。
算例一:最近深度和透明混合不同
两点投影到同一像素,深度分别四米和二米。深度缓冲先见四米再见二米,结果二米;倒换输入顺序仍二米,因此对不同深度的点顺序无关。若两点具有半透明度,则远点仍可能贡献颜色,深度缓冲会错误丢弃它。若深度完全相同,颜色覆盖还需要明确相等时的规则,不能只凭比较运算偶然先后决定材质含义。项目测试只检查最小深度,不声称完整表面光栅化。
对连续体积,令射线参数 s 表示距离,密度 sigma 非负,单位为每米。把一小段长度 ds 的透射比例近似为一减 sigma 乘 ds,分段相乘再取连续极限得到指数衰减。到位置 s 的透射率 T 是此前密度线积分取负指数;局部颜色贡献是透射率乘密度乘颜色再积分。这里颜色表示被该段散射或发出的有效辐射,忽略真实多次散射,是采用的体渲染模型而非任意材质的完整物理。
若每段内部密度与颜色近似常数,段长为 delta,段不透明度 alpha 等于一减 exp 负 sigma delta;前段剩余透射率是所有一减 alpha 的乘积。第 i 段权重为此前透射率乘本段 alpha,颜色为这些权重乘颜色的和,再加剩余背景。权重非负,总和加背景权重为一,可用递推证明:加入一段只把已有剩余量拆成新贡献与新剩余。这一归一性是程序检查,而不是可随便删掉的细节。
算例二:两层体积的颜色与顺序
前层为红色,alpha 等于零点五;后层为蓝色,alpha 也为零点五,背景黑。前层贡献红色零点五,后层透射率只剩零点五,所以蓝色贡献零点二五,背景剩余零点二五但为黑。最终 RGB 是零点五、零、零点二五。若交换红蓝深度,结果变成零点二五、零、零点五。把颜色直接相加得到零点五、零、零点五会遗漏可见性,无法与体渲染等同。
NeRF 原始方法用网络把三维位置与观察方向映射为密度与颜色,再沿射线采样并优化多视角像素误差。位置编码、体积权重和视角依赖各承担不同职责;“有一个坐标输入神经网络”并不足以构成 NeRF 实现。本项目不实现该网络、射线体积分或层次采样,因此只用它作机制比较,不把当前亮斑拟合称为已训练 NeRF,也不据小场景速度推断其训练性能。
原始 3D Gaussian Splatting 用显式三维各向异性 Gaussian 表示场景,结合投影协方差、可见性排序、颜色表示与密度控制做优化。这里的项目仅保留“小量三维 Gaussian 参数通过投影得到像素核并可微拟合”这个局部机制。它没有各向异性协方差、球谐方向颜色、分裂剪枝、不透明层排序和高效 GPU 光栅化,不能仅因为名字有 Gaussian 就声称完整复现原论文。
我们的场景被明确定义为稀疏透明发光珠。每个珠子有三维中心、三个强度通道和一个正半径;投影中心来自一般 P,屏幕半径近似焦距乘世界半径除相机深度。像素强度是背景加所有二维 Gaussian 核乘颜色的和,没有前后遮挡。数据生成与拟合共享这项受控假设,因此它适合验证信息链和优化机制,但自然场景的遮挡与反射不在解释范围。
屏幕半径公式也有近似条件。它把局部投影当各向同性,忽略珠子深度方向的扩展和画面边缘的透视各向异性;当半径相比深度很小、区域不太偏离光轴时较合理。严格线性化可把三维协方差用投影雅可比前后相乘得到二维协方差,下一章写出该关系。这里像素生成器本身直接用这条半径规则,因此“模型内精确拟合”与“现实球体精确投影”要分开。
图像全局 MSE 容易被大量黑背景稀释。亮点只有数百像素,即使位置明显偏移,整幅小图平均误差也可能不大。项目同时记录观测前景区域上的误差与几何中心误差,避免背景占比决定成功。前景掩码使用固定观测阈值,不根据预测哪里容易就选择哪里。若改表示为不透明物体,还必须补轮廓、深度与遮挡检查,不能沿用当前尾部光斑指标当作表面质量。
表示选择影响欠定性。只有中心点的几何不能约束其真实颜色、半径与遮挡;仅用几张光度图像,也可能用不同半径与强度组合得到类似总能量。引入更多视角、已知尺度、合理先验和独立评价可减少歧义,但不凭空证明唯一。课程把可学习参数限制为每珠七个,固定已标定相机,目的是让每个梯度与失败能追到具体假设,不将小参数实验夸大为完整现实场景恢复。
一个合格场景档案同时保存几何、表示类型、坐标单位、相机、成像假设、未知区域与生成图片。如果只有渲染截图,无法判断它是否由预存二维图粘贴;如果只有点云坐标,无法判断像素是否被解释。下一章用可微渲染把两者连接,并用留出视图验证,同样保留投影矩阵和实际输入文件,确保结果能从观测重新计算。
可加发光模型还有一个易核查的非物理饱和边界:多个亮核重合时强度可能超过一。保存八位图片会裁剪到一,训练若仍用未裁剪预测便无法完全解释被裁剪像素。当前场景稀疏、单核峰值零点七二,避免了显著重叠饱和;这是一项数据设计条件。扩展到密集场景时需记录饱和掩码或采用匹配的相机响应,不能把裁剪后的图片当无条件线性观测。
front_alpha,back_alpha=.5,.5
weights=[front_alpha,(1-front_alpha)*back_alpha]
bg=(1-front_alpha)*(1-back_alpha)
assert sum(weights)+bg==1
print({'red':weights[0],'blue':weights[1],'background_weight':bg})TRY IT YOURSELF
练习一:体素成本
一个边长二米的立方区域用每边一百格表示,总格数多少?分辨率每边提高到二百,存储增为几倍?若每格四个float32数,忽略开销各多少字节?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习二:权重归一
三层alpha依次零点二、零点五、零点五,计算三层颜色权重及背景权重,证明总和为一。
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习三:实现声明
项目训练七参数小Gaussian珠子,能否称为“完整3DGS”或“训练NeRF”?按渲染和参数各指出缺失项。