散射体的3dgs建模

Title: Don’t Splat your Gaussians: Volumetric Ray-Traced Primitives for Modeling and Rendering Scattering and Emissive Media
https://arxiv.org/pdf/2405.15425

最近很喜欢云,但是现在重建/生成户外场景的都是反射表面,根本不关心天空,要么就是panorama那样的hdri贴图,体积云这一块无人在意。这篇文章是我找到为数不多的高效散射表达

BACKGROUND

RTE:

\[(ω⋅∇)L(x,ω)=−μ_a(x)L(x,ω)−μ_s(x)L(x,ω)+μ_a(x)Q(x,ω)+μ_s(x)S(x,ω) \]

这四项分别为:一部分光被吸收,一部分光被散射走,介质可能自己发光,其他方向的光被散射进来;这个ode可以得到最下面的积分形式

in-scattering:

\[S(x,ω)=∫_{S^2}​f_p​(x,ω′→ω)L(x,ω′)dω′ \]

把球面上的其他方向的光积起来,fp是相位函数

消光系数:

\[\mu_t = \mu_a + \mu_s = \rho \sigma \]

大概跟粒子密度和面积有关

体渲染方程:

\[L(x_0,ω)=∫_0^s​T(x_0,x_t)μ_t(x_t)L_o(x_t,ω)dt+T(x_0,x_s)L(x_s,ω) \]

T是透射概率,用一个exp函数计算;Lo分为\(L_o(x,ω)=(1−α)Q+αS\),吸收(发射)项和散射项

Volumetric primitives

用3dgs的primitive计算这个渲染方程,就是把连续的积分给拆到离散的高斯球上,分别计算每段的贡献,这里分段是按gaussian的边界,一段可能有多个gaussian重叠,系数直接相加

\[L(x_0,ω)=\sum_{k=1}^MT_{k−1}(x_0,x_t)L_k(\hat x_{\hat t_{k,0}},ω) \]

这里计算的是最终看到的亮度 = Sum {每一段产生的光 × 到相机仍然存活的概率}

\[L_k(\hat x_{\hat t_{k,0}},ω)=∫_{\hat t_{k,0}}^{\hat t_{k,1}} T(\hat x_{\hat t_{k,0}},x_t)\sum_{i∈S_k}σ_iK_i(x_t)L_{o,i}(x_t,ω)dt \]

\(K_i\)是用gaussian建模上面公式的\(\rho\)的分布,乘上\(\sigma\)得到\(\mu_t\),然后\(S_k\)是这一段里的gaussian的集合,对光的贡献直接加起来,在外面乘上这一段开头到积分位置\(x_t\)的透射率

sampling

\[p(t)=μ_t(x_t)T(x_0,x_t)\\ T(x_0,x_t)=\exp(−∫_0^tμ_t(x_{t′})d_{t′}) \]

积分可以得到累积分布\(F(t) = \int_0^t p(s) ds = 1 - T(x_0,x_t)\),因此按p采样等价于采样\(\xi \sim U(0,1)\),然后搜索\(t = T^{-1}(1 - \xi)\)

为了提升速度,kernel 非常多、非常小的时候,直接在段内均匀采样

Kernels

作者研究了两种kernel:Gaussian和Epanechnikov Kernel,给出了\(\tau(t)\)的闭式解(erf函数是啥没学过啊),计算误差大的时候用 bisection solver / Newton-Raphson solver

Others

7.2提了一下对散射体optimization的方法,从一个 primitive 开始逐渐向当前 primitives 的 bounding sphere 周围随机添加新 primitives,用一种Bounded Adam优化

8对比了gaussian kernel和epanechnikov kernel,前者适合平滑体积数据(云、烟),后者适合高频细节 / 硬表面,Epanechnikov更紧凑更快。

posted @ 2026-01-13 19:44  lcyfrog  阅读(6)  评论(0)    收藏  举报