假设我们已经将3D场景体素化为规则的3D立方体网格,存储了平均(漫射)辐射度和一些标志,指示体素是否为空。接下来,对3D纹理(体素)的更精细级别进行下采样以获得更粗糙的级别(“预积分”),将其存储为该纹理的MIP级别。 (我知道可以使用一些稀疏结构来代替,但从概念上讲,规则网格是最容易掌握的。)

现在,考虑到我们的曲面位置(因此还有体素)在)中,体素圆锥跟踪如何工作以及如何应用?

#1 楼

照明组件

如果我们的场景仅包含点光源(例如,全向照明,聚光灯等)和发光表面,则在表面位置$ x $处的照明贡献计算如下:


照常计算与发射表面相关的自发光(即0次反弹/表面相互作用),而无需使用场景的体素化(将照明贡献添加到场景的体素化的情况就是这种情况) );
照常计算与点光源关联的直接照明(即1次反弹/表面交互),而无需使用场景的体素化(将这种照明贡献添加到场景的体素化的情况);
与发射表面相关联的直接照明(即1次反弹/表面相互作用)是使用体素圆锥描迹从场景的体素化获得的;
与点光源相关联的间接照明(即2次反弹/表面相互作用)为通过使用体素圆锥描迹从场景的体素化获得。

通过使用体素圆锥跟踪计算场景的体素化中所有体素的漫射照明,可以通过(可选)其他弹跳/表面相互作用获得漫射照明。积累在体素中。这要求每个体素还存储(近似)与这些体素重叠的场景表面的法线分布。

场景体素化(3)-(4)

/>从场景的体素化($ L_v $)获得的向外辐射:

$$ L_o \!\ left(x,\ hat \ omega_o \ right)= \ int_ \ Omega f_ {r} \!\ left(x,\ hat \ omega_o,\ hat \ omega_i \ right)L_v \!\ left(x,\ hat \ omega_i \ right)\ left(\ hat {n} \ cdot \ hat \ omega_i \ right )\ mathrm {d} \ hat \ omega_i。$$

对于分散式BRDF $ f_ {r} \!\ left(x,\ hat \ omega_o,\ hat \ omega_i \ right)= \ frac {k_d} {\ pi} $:

$$ L_o \!\ left(x,\ hat \ omega_o \ right)= \ frac {k_d} {\ pi} \ int_ \ Omega L_v \!\ left(x,\ hat \ omega_i \ right)\ left(\ hat {n} \ cdot \ hat \ omega_i \ right)\ mathrm {d} \ hat \ omega_i。$$

要在$ N $分离子域中对$ \ Omega $进行分区,$ \ Omega_j $(例如$ \ approx $锥体)(例如$ \ Omega_1 \ cup〜...〜\ cup \ Omega_N = \ Omega $和$ \ Omega_i \ cap \ Omega_j = \ emptyset $每个$ i \ ne j $):

$$ L_o \!\ left(x,\ hat \ omega_o \ right)= \ frac {k_d} {\ pi} \ sum_ {j = 1} ^ {N} \ int _ {\ Omega_ {j}} L_v \!\ left(x,\ hat \ omega_ {j,i} \ right)\ left(\ hat {n} \ cdot \ hat \ omega_ {j,i} \ right )\ mathrm {d} \ hat \ omega_ {j,i}。$$

依靠方向为$ \ hat \ omega_ {j} $且有孔径$的单个圆锥\ alpha_ {j} $,而不是带有方向的单个光线$ \ hat \ omega_ {j,i} $,对于每个子域$ \ Omega_j $:

$$ L_o \!\ left(x,\ hat \ omega_o \ right)\ approx \ frac {k_d} {\ pi} \ sum_ {j = 1} ^ {N} L_v \!\ left(x,\ hat \ omega_o \ o \ alpha_ {j} \ right)\ int _ {\ Omega_ {j}} \ left(\ hat {n} \ cdot \ hat \ omega_ {j,i} \ right)\ math rm {d} \ hat \ omega_ {j,i} $$

$$ \ hat {W} _j = \ frac {1} {\ pi} \ int _ {\ Omega_ {j}} \ left(\ hat {n} \ cdot \ hat \ omega_ {j,i} \ right)\ mathrm {d} \ hat \ omega_ {j,i} $$

$$ L_o \ !\ left(x,\ hat \ omega_o \ right)\ approx k_d \ sum_ {j = 1} ^ {N} \ hat {W} _j L_v \!\ left(x,\ hat \ omega_o {j},\ alpha_ {j} \ right)。$$

例如,我们可以使用以下六个圆锥,每个圆锥的孔径为$ \ frac {\ pi} {6} $。

关于表面法线的蓝锥的归一化权重等于:

$$ \ hat {W} _ {\ mathrm {blue}} = \ frac {1} {\ pi} \ int_ {0} ^ {2 \ pi} \ int_ {0} ^ {\ frac {\ pi} {6}} \ cos \!\ theta \ sin \!\ theta \,\ mathrm {d} \ theta \,\ mathrm {d} \ phi = \ frac {1} {4}。$$

其他圆锥的归一化权重大约等于:

$$ \ hat {W} _ {\ mathrm {紫色|红色|绿色|橙色|棕色}} \ approx \ frac {1- \ hat {W} _ {\ mathrm {blue}}} {5} = \ frac {3} {20}。$$

对于镜面BRDF,通常使用单个圆锥体,其方向为$ 2 \ left(\ hat {n} \ cdot \ hat \ omega_o \ right)\ hat {n}-\ hat \ omega_o $(即$的反射方向) \ hat \ omega_o $约$ \ hat {n} $),并根据表面材料的粗糙度设置一个孔径。

体素锥描迹
$ L_v \! \ left(x,\ hat \ omega_ {j},\ alpha_ {j} \ right)$是使用体素圆锥跟踪计算的,可以通过在UVW纹理空间中行进Mip映射的3D体素纹理来实现。 >
我们累积的辐射度(红色,绿色,蓝色通道)和不透明度(alpha通道)被初始化为零。

Lv ← [0, 0, 0, 0]


我们将圆锥行进距离初始化为一个偏移量,以避免对与发射表面相关的自发光和与点光源相关的直接照明进行两次采样。我们基本上需要跳过包含需要估计其向外辐射的表面位置的体素。 :

distance ← voxel_offset