GaRe:面向非约束户外照片集的可重光照 3D 高斯溅射技术简要解析
论文网址:https://arxiv.org/pdf/2507.20512
最终渲染图像 III 的公式
现在我们来推导GaRe框架中最终渲染图像 III 的公式。
首先,我们得明确户外场景的光照来源。大家想想,户外的光主要来自哪里呢?没错,有直接的阳光,有天空的漫反射,还有物体之间互相反射形成的间接光。这些光照在物体上,再结合物体自身的材质,就形成了我们看到的图像。
物体自身的材质属性是相对稳定的,不会因为光照变化而改变,我们把这种属性称为反射率,用 RRR 来表示。它就像物体的“底色”,决定了物体对光的反射能力。
接下来看光照成分。阳光是很强的直射光,它的照射范围是有限的,只有被阳光直接照到的地方才会受到它的影响。我们用 SsunS_{sun}Ssun 表示阳光产生的明暗效果,再用一个太阳可见性 vvv 来标记哪些区域能被阳光照到,vvv 在被照射区域为1,未被照射区域为0,所以阳光对图像的贡献就是 v⋅Ssunv \cdot S_{sun}v⋅Ssun。
天空的漫反射光比较柔和,能均匀地照亮整个场景,我们用 SskyS_{sky}Ssky 来表示它产生的明暗效果。
还有物体之间的间接反射光,比如阳光照在地面上,地面又把光反射到墙壁上,这种光我们用 SindS_{ind}Sind 表示。
最后,物体的反射率 RRR 会与这些光照成分相互作用,共同形成我们看到的图像。所以,把这些部分组合起来,就得到了最终渲染图像(I)的公式:I=R⋅(v⋅Ssun+Ssky+Sind)(1)I = R \cdot (v \cdot S_{sun} + S_{sky} + S_{ind})\tag{1}I=R⋅(v⋅Ssun+Ssky+Sind)(1)
这个公式既体现了不同光照成分的作用,又考虑了物体自身的材质,能很好地还原户外场景的视觉效果。
太阳可见性图 V^\hat{\mathcal{V}}V^ 的公式
我们再来一步步推导GaRe框架中用于计算精细太阳可见性图的公式(4)。这个公式是基于残差的可见性提取方法的核心,目的是精确区分场景中被阳光直接照射的区域和阴影区域。
太阳可见性图 V^\hat{\mathcal{V}}V^ 是一个二进制掩码,其中:
- 像素值为1,表示该区域能被阳光直接照射;
- 像素值为0,表示该区域处于阴影中(阳光被遮挡)。
准确提取这个掩码,是后续分离“太阳明暗”(阳光直射效果)的基础。
首先,我们需要训练一个“仅环境光”的高斯模型。什么是“仅环境光”?就是排除阳光直射的影响,只保留天空漫反射、物体间接反射等柔和光照的效果。
对于每个高斯(场景中的一个3D采样点),它的环境色 ckambc_{k}^{amb}ckamb (ambient,环境的) 由以下公式计算:
ckamb=Φamb(fkamb,Eiamb)(2)c_{k}^{amb} = \Phi_{amb}(f_{k}^{amb}, \mathcal{E}_{i}^{amb})\tag{2}ckamb=Φamb(fkamb,Eiamb)(2)
其中,Φamb\Phi_{amb}Φamb 是一个轻量级MLP,fkambf_{k}^{amb}fkamb 是高斯的局部特征,Eiamb\mathcal{E}_{i}^{amb}Eiamb 是单张图像的环境光照嵌入(记录该图像的环境光特征)。
为了让“仅环境光”模型渲染的图像尽可能真实,我们用掩码L1损失来优化:
Lamb=∥(I^amb−I)⋅(1−V^c)∥1(3)\mathcal{L}_{amb} = \left\| \left(\hat{\mathcal{I}}_{amb} - \mathcal{I}\right) \cdot \left(1 - \hat{\mathcal{V}}_c\right) \right\|_1\tag{3} Lamb=(I^amb−I)⋅(1−V^c)1(3)
- I^amb\hat{\mathcal{I}}_{amb}I^amb:用“仅环境光”模型渲染的图像(不含阳光);
- I\mathcal{I}I:包含全局照明(阳光+环境光)的真实图像;
- V^c\hat{\mathcal{V}}_cV^c:预处理得到的“粗略可见性图”(标记阳光可能照射的区域);
- (1−V^c)\left(1 - \hat{\mathcal{V}}_c\right)(1−V^c):掩码,只关注“非阳光区”(环境光主导的区域),确保环境光渲染在这些区域与真实图像一致。
当“仅环境光”模型训练好后,我们计算真实图像与仅环境光渲染图像的差值,得到残差图:
I^res=∣I−I^amb∣\hat{\mathcal{I}}_{res} = \left| \mathcal{I} - \hat{\mathcal{I}}_{amb} \right| I^res=I−I^amb
为什么要算残差?因为残差图能放大阳光直射的影响:
- 阳光直射区域亮度高,残差值大;
- 阴影或纯环境光区域亮度低,残差值小。
残差图中,阳光区和阴影区的残差值分布不同。我们用二进制聚类算法把像素分为两类:
- 一类对应“高残差”(阳光直射区);
- 一类对应“低残差”(阴影区)。
聚类过程中,会迭代更新两个聚类中心μ1\mu_1μ1(高残差中心)和 μ2\mu_2μ2(低残差中心)。
对于每个像素,判断它更接近哪个聚类中心:
- 若像素残差值更接近 μ1\mu_1μ1(高残差),则属于阳光直射区,标记为1;
- 若更接近 μ2\mu_2μ2(低残差),则属于阴影区,标记为0。
这就得到了公式(4):
V^={1,若 ∥I^res−μ1∥2<∥I^res−μ2∥20,否则(4)\hat{\mathcal{V}} = \begin{cases} 1, & \text{若 } \left\| \hat{\mathcal{I}}_{res} - \mu_1 \right\|^2 < \left\| \hat{\mathcal{I}}_{res} - \mu_2 \right\|^2 \\ 0, & \text{否则} \end{cases}\tag{4} V^=⎩⎨⎧1,0,若 I^res−μ12<I^res−μ22否则(4)
总结公式(4)的核心思路是:
- 先排除阳光,用环境光模型渲染图像;
- 通过残差放大阳光的影响区域;
- 用聚类区分阳光区和阴影区,最终得到精确的太阳可见性图。
这个方法避免了传统3D建模的复杂性,纯图像域的操作更高效,且能捕捉到细微的光影边界,为后续真实的重新照明打下基础。
场景光照的精细分解建模
我们再来梳理GaRe框架中3.3节“Illumination Decomposition”(光照分解)部分的公式推导逻辑,看看这些公式是如何一步步实现对场景光照的精细分解的。
首先,我们要明确光照分解的核心目标:基于内在图像分解的思想,把场景的全局照明拆分成反射率和三个物理可解释的明暗成分——太阳明暗、天空明暗、间接明暗,这样才能实现后续灵活的重新照明。整个推导过程围绕“如何为每个3D高斯预测这些成分的颜色”以及“如何通过损失函数监督分解的准确性”展开。
场景中的每个3D高斯(可理解为场景的基本采样单元)都需要分别预测反射率和三个明暗成分的颜色,这些颜色通过不同的MLP(多层感知器)由对应的特征解码得到:
-
反射率颜色(ckrefc_{k}^{ref}ckref)
反射率是物体固有的材质属性,不受光照影响,因此仅由高斯自身的反射率特征决定:
ckref=Φref(fkref)(5)c_{k}^{ref} = \Phi_{ref}(f_{k}^{ref}) \tag{5} ckref=Φref(fkref)(5)
其中,fkreff_{k}^{ref}fkref 是第 kkk 个高斯的反射率特征,Φref\Phi_{ref}Φref 是专用的MLP,负责将特征映射为反射率颜色。这保证了反射率在所有视角下保持一致(比如树叶的绿色、墙面的灰色)。 -
太阳明暗颜色(cksunc_{k}^{sun}cksun)
太阳明暗受阳光照射角度、强度等图像特定光照条件影响,因此需要结合高斯的太阳光照特征和单张图像的太阳光照嵌入(记录该图像的阳光特性):
cksun=Φsun(fksun,Eisun)(6)c_{k}^{sun} = \Phi_{sun}(f_{k}^{sun}, \mathcal{E}_{i}^{sun})\tag{6} cksun=Φsun(fksun,Eisun)(6)
这里,fksunf_{k}^{sun}fksun 是高斯的太阳光照特征,Eisun\mathcal{E}_{i}^{sun}Eisun 是第 iii 张图像的太阳光照嵌入,Φsun\Phi_{sun}Φsun 通过融合二者,预测高斯在阳光照射下的颜色(比如阳光直射的高光区域)。 -
天空明暗颜色(ckskyc_{k}^{sky}cksky)
天空明暗由天空漫反射光决定,同样与图像的光照条件相关,因此类似地:
cksky=Φsky(fksky,Eisky)(7)c_{k}^{sky} = \Phi_{sky}(f_{k}^{sky}, \mathcal{E}_{i}^{sky})\tag{7} cksky=Φsky(fksky,Eisky)(7)
其中,fkskyf_{k}^{sky}fksky 是高斯的天空光照特征,Eisky\mathcal{E}_{i}^{sky}Eisky 是图像的天空光照嵌入,Φsky\Phi_{sky}Φsky 用于预测天空光照射下的颜色(比如阴天时的柔和蓝色调)。 -
间接明暗颜色(ckindc_{k}^{ind}ckind)
间接明暗来自场景内的光反射(如地面反射到墙面的光),需要额外考虑高斯的基础颜色(来自球谐函数,反映初步的颜色信息):
ckind=Φind(ck,fkind,Eiind)(8)c_{k}^{ind} = \Phi_{ind}(c_{k}, f_{k}^{ind}, \mathcal{E}_{i}^{ind}) \tag{8} ckind=Φind(ck,fkind,Eiind)(8)
这里,ckc_{k}ck 是高斯的基础颜色,fkindf_{k}^{ind}fkind 是间接光照特征,Eiind\mathcal{E}_{i}^{ind}Eiind 是图像的间接光照嵌入,Φind\Phi_{ind}Φind 通过融合这些信息,捕捉局部反射的复杂光照效果。
有了每个高斯的颜色后,通过光栅化(rasterization)将这些颜色“喷涂”到图像平面,得到全局的渲染成分:
- 反射率渲染结果R^\hat{R}R^(由ckrefc_{k}^{ref}ckref合成);
- 太阳明暗渲染结果S^sun\hat{S}_{sun}S^sun(由cksunc_{k}^{sun}cksun合成);
- 天空明暗渲染结果S^sky\hat{S}_{sky}S^sky(由ckskyc_{k}^{sky}cksky合成);
- 间接明暗渲染结果S^ind\hat{S}_{ind}S^ind(由ckindc_{k}^{ind}ckind合成)。
最终,整个场景的渲染图像 I^\hat{I}I^ 按照公式(1)合成:
I^=(V^⋅S^sun+S^sky+S^ind)⋅R^\hat{\mathcal{I}} = \left( \hat{\mathcal{V}} \cdot \hat{\mathcal{S}}_{sun} + \hat{\mathcal{S}}_{sky} + \hat{\mathcal{S}}_{ind} \right) \cdot \hat{\mathcal{R}} I^=(V^⋅S^sun+S^sky+S^ind)⋅R^
其中 V^\hat{\mathcal{V}}V^ 是太阳可见性图,控制阳光照射的区域。
为了保证分解的准确性,框架采用区域监督策略:用二进制掩码分割真实图像,对每个成分的作用区域单独施加损失约束。
-
太阳明暗损失(L1sun\mathcal{L}_{1}^{sun}L1sun)
仅在阳光能直射的区域(由 V^\hat{\mathcal{V}}V^ 标记)监督太阳明暗的效果,约束渲染图像与真实图像的差异:
L1sun=λ1sun∥(I^−I)⋅V^∥1(9)\mathcal{L}_{1}^{sun} = \lambda_{1}^{sun} \left\| \left( \hat{\mathcal{I}} - \mathcal{I} \right) \cdot \hat{\mathcal{V}} \right\|_1 \tag{9} L1sun=λ1sun(I^−I)⋅V^1(9)
这里λ1sun\lambda_{1}^{sun}λ1sun是权重系数,确保阳光区域的渲染误差最小化。 -
天空明暗损失(L1sky\mathcal{L}_{1}^{sky}L1sky)
仅在天空区域(由天空掩码(\mathcal{M}_{sky})标记)监督天空明暗,确保天空颜色仅由天空明暗和反射率决定:
L1sky=λ1sky∥(S^sky⋅R^−I)⋅Msky∥1(10)\mathcal{L}_{1}^{sky} = \lambda_{1}^{sky} \left\| \left( \hat{\mathcal{S}}_{sky} \cdot \hat{\mathcal{R}} - \mathcal{I} \right) \cdot \mathcal{M}_{sky} \right\|_1 \tag{10} L1sky=λ1sky(S^sky⋅R^−I)⋅Msky1(10)
这保证了天空区域的颜色变化符合天空光的物理规律。 -
间接明暗损失(L1ind\mathcal{L}_{1}^{ind}L1ind)
间接光照主要影响“非阳光直射且非天空”的区域(由间接掩码Mind\mathcal{M}_{ind}Mind标记,定义为太阳可见性图补集与天空掩码补集的交集),因此损失为:
L1ind=λ1ind∥((S^sky+S^ind)⋅R^−I)⋅Mind∥1(11)\mathcal{L}_{1}^{ind} = \lambda_{1}^{ind} \left\| \left( \left( \hat{\mathcal{S}}_{sky} + \hat{\mathcal{S}}_{ind} \right) \cdot \hat{\mathcal{R}} - \mathcal{I} \right) \cdot \mathcal{M}_{ind} \right\|_1 \tag{11} L1ind=λ1ind((S^sky+S^ind)⋅R^−I)⋅Mind1(11)
这里将天空明暗与间接明暗结合,是因为非阳光区域的照明主要来自这两者的叠加。
区域监督可能导致各成分在非约束区域出现结构混乱(比如阴影边缘不连续),因此引入结构一致性损失(SCL),强制各明暗成分与反射率保持相同的结构特征(如边缘、纹理)。
基础的SCL公式为:
SCL(S,R,M)=∥(∇S−∇R)⋅M∥1(12)SCL(\mathcal{S}, \mathcal{R}, \mathcal{M}) = \left\| \left( \nabla \mathcal{S} - \nabla \mathcal{R} \right) \cdot \mathcal{M} \right\|_1 \tag{12} SCL(S,R,M)=∥(∇S−∇R)⋅M∥1(12)
其中∇\nabla∇是一阶差分(捕捉结构),M\mathcal{M}M 是区域掩码。
将其扩展到所有明暗成分,并排除天空区域(天空结构与反射率无关),得到总结构一致性损失:
Lsc=∑iλsciSCL(S^i,R^,1−Msky)(13)\mathcal{L}_{sc} = \sum_{i} \lambda_{sc}^{i} SCL\left( \hat{\mathcal{S}}_i, \hat{\mathcal{R}}, 1 - \mathcal{M}_{sky} \right) \tag{13} Lsc=i∑λsciSCL(S^i,R^,1−Msky)(13)
其中 iii 遍历太阳、天空、间接明暗,确保全局结构一致。
总结这一节的公式推导逻辑可概括为:
- 为每个高斯设计MLP,分别预测反射率和三个明暗成分的颜色;
- 将高斯颜色合成为全局渲染成分,按物理规律组合成最终图像;
- 通过区域监督损失约束各成分在专属区域的准确性;
- 用结构一致性损失弥补区域监督的不足,保证全局结构连贯。
这些公式共同实现了对光照的精细分解,为后续灵活、真实的重新照明奠定了基础。
基于光线追踪的阴影建模
这部分的核心目标是通过光线追踪实现真实的阴影模拟,并通过优化策略降低计算成本,让阴影效果既能准确反映光照遮挡关系,又能支持实时重新照明。我们一步步来看:
要模拟阴影,首先需要判断每个3D高斯(场景的基本单元)是否能被特定方向的光线(如阳光)照射到——这就是 “可见性查询”。框架通过光线追踪实现这一点:
对于每个高斯GkG_kGk,从其中心沿光线方向did_idi(比如阳光入射方向)发射一条光线,计算光线穿过所有可能遮挡高斯后的剩余透射率(transmittance),以此判断GkG_kGk是否可见。透射率的递归计算公式为:
Tj=(1−αj−1)⋅Tj−1⋅nj−1⋅di⊤,其中 T1=1(14)T_j = (1 - \alpha_{j-1}) \cdot T_{j-1} \cdot n_{j-1} \cdot d_i^\top, \quad \text{其中 } T_1 = 1 \tag{14} Tj=(1−αj−1)⋅Tj−1⋅nj−1⋅di⊤,其中 T1=1(14)
-
变量解析:
- TjT_jTj:光线穿过第j−1j-1j−1个高斯后的剩余透射率(值越大,光线被遮挡越少);
- T1=1T_1 = 1T1=1:初始透射率(光线出发时无遮挡);
- αj−1\alpha_{j-1}αj−1:第j−1j-1j−1个高斯的不透明度(值越大,遮挡能力越强);
- nj−1n_{j-1}nj−1:第j−1j-1j−1个高斯的法向量(由最短主轴近似,反映表面朝向);
- nj−1⋅di⊤n_{j-1} \cdot d_i^\topnj−1⋅di⊤:法向量与光线方向的点积(若为负,说明高斯背面朝向光线,几乎不遮挡)。
-
可见性判断:光线穿过所有遮挡高斯后,最终的TjT_jTj就是高斯GkG_kGk的光线追踪可见性vkrtv_k^{rt}vkrt。若TjT_jTj接近1,说明GkG_kGk能被光线照射(无遮挡);若接近0,则表示被严重遮挡(处于阴影中)。
由于高斯表示的几何精度有限,直接光线追踪可能出现误差:比如天空中“浮动的高斯”会错误遮挡地面高斯,动态物体的“瞬态高斯”会导致不同视角的可见性不一致。因此,在光线追踪前增加两步过滤:
- 天空过滤:根据天空掩码Msky\mathcal{M}_{sky}Msky,移除位于天空区域的高斯,避免其干扰地面物体的可见性判断;
- 前端过滤:丢弃深度值小于对应渲染深度的高斯(这些高斯通常是动态物体的瞬态高斯,位于静态表面前方)。
过滤后,参与光线追踪的高斯更符合场景真实几何,可见性计算更准确。
光线追踪虽然准确,但实时执行时计算开销太大。为解决这一问题,框架将光线追踪的可见性结果 “烘焙”(编码) 到高斯的可见性特征中,推理时直接通过特征预测可见性:
对于给定光线方向did_idi,第kkk个高斯的预测可见性vkv_kvk由下式计算:
vk=Φvis(fkvis,pk,di)(15)v_k = \Phi_{vis}\left(f_k^{vis}, p_k, d_i\right) \tag{15} vk=Φvis(fkvis,pk,di)(15)
- 变量解析:
- Φvis\Phi_{vis}Φvis:用于预测可见性的MLP;
- fkvisf_k^{vis}fkvis:烘焙了光线追踪可见性信息的高斯特征;
- pkp_kpk:高斯的中心坐标(让MLP感知空间位置,提升预测精度);
- did_idi:光线方向(如阳光角度)。
通过这一步,推理时无需重复光线追踪,只需用MLP快速预测可见性,大幅降低计算成本。
为了让MLP预测的可见性(公式15)与光线追踪的真实结果一致,需要定义损失函数进行训练:
Lvis=∥(V^−V^rt)⋅(1−Msky)∥2(16)\mathcal{L}_{vis} = \left\| \left( \hat{\mathcal{V}} - \hat{\mathcal{V}}_{rt} \right) \cdot \left( 1 - \mathcal{M}_{sky} \right) \right\|_2 \tag{16} Lvis=(V^−V^rt)⋅(1−Msky)2(16)
- 变量解析:
- V^\hat{\mathcal{V}}V^:MLP预测的可见性图;
- V^rt\hat{\mathcal{V}}_{rt}V^rt:光线追踪得到的真实可见性图;
- (1−Msky)\left( 1 - \mathcal{M}_{sky} \right)(1−Msky):非天空区域掩码(天空区域的可见性固定为1,无需优化);
- 用L2范数衡量两者差异,确保预测可见性尽可能接近真实值。
总结这一小节的公式推导逻辑可概括为:
- 用光线追踪(公式14)计算高斯的真实可见性,判断阴影区域;
- 通过两步过滤优化场景几何,提升可见性计算的准确性;
- 将可见性信息烘焙到特征中,用MLP(公式15)实现高效预测;
- 用损失函数(公式16)让预测结果逼近真实值,保证阴影效果真实。
这些步骤共同实现了“准确且高效”的阴影建模,为实时重新照明提供了关键支持。
实现细节
在GaRe框架中,实现细节部分主要介绍了网络结构设计、训练流程、参数设置等关键技术细节,确保模型能够稳定训练并高效生成真实的光照和阴影效果,具体如下:
1. 网络结构设计
框架中所有网络均采用紧凑的3层多层感知器(MLP),并在每个隐藏层后应用ReLU激活函数:
- 可见性烘焙网络:层大小设置为{32, 32, 32},输出层使用Tanh激活函数,用于将可见性特征映射到[-1, 1]范围内的可见性预测结果。
- 其他网络(如反射率、太阳明暗、天空明暗、间接明暗的解码网络):层大小设置为{64, 64, 64},输出层使用Sigmoid激活函数,将特征映射到[0, 1]范围内的颜色值。
2. 三阶段训练流程
为优化模型参数,框架采用分阶段训练方式,各阶段目标和迭代次数如下:
- 阶段1:仅环境光场景表示优化(对应3.2节残差可见性提取):迭代10k次,训练仅包含环境光(无阳光直射)的高斯模型,为后续可见性提取奠定基础。
- 阶段2:明暗成分优化(对应3.3节光照分解):迭代100k次,优化反射率和太阳、天空、间接明暗成分的解码,确保各光照成分的分解准确。
- 阶段3:可见性烘焙优化(对应3.4节光线追踪阴影建模):迭代20k次,将光线追踪得到的可见性信息编码到高斯特征中,提升实时可见性预测的精度。
3. 特征与嵌入维度初始化
- 高斯特征维度:每个高斯的明暗特征(反射率、太阳、天空、间接)初始化为18维,可见性特征初始化为6维。
- 图像嵌入维度:单张图像的光照嵌入(太阳、天空、间接、环境光)初始化为32维,用于捕捉图像特定的光照特性。
4. 学习率与衰减策略
- 明暗特征:学习率初始为2.5e-3。
- 可见性特征:学习率初始为1.0e-3。
- MLP与嵌入:初始学习率分别为8.0e-4和5.0e-3,随后按指数衰减至5.0e-6和5.0e-5,以稳定训练过程并提升收敛精度。
5. 正则化参数设置
损失函数中的权重系数(正则化参数)设置如下:
- 太阳明暗的L1损失权重λ1sun=1.0\lambda_{1}^{sun}=1.0λ1sun=1.0;
- 天空和间接明暗的L1损失权重λ1sky=λ1ind=10.0\lambda_{1}^{sky}=\lambda_{1}^{ind}=10.0λ1sky=λ1ind=10.0;
- 太阳明暗的结构一致性损失权重λscsun=0.1\lambda_{sc}^{sun}=0.1λscsun=0.1;
- 天空和间接明暗的结构一致性损失权重λscsky=λscind=5.0\lambda_{sc}^{sky}=\lambda_{sc}^{ind}=5.0λscsky=λscind=5.0。
这些参数通过平衡各损失项的贡献,确保模型优先优化关键光照成分,同时维持全局结构一致性。
综上,这些实现细节从网络结构、训练流程到参数设置均围绕“高效、准确地分解光照成分并生成真实阴影”的目标设计,为GaRe框架在户外场景重新照明任务中的性能提供了技术保障。