title: VXGI
date: 2022-04-07 12:00
count: true
tags:
Lumen 中的 VoxelLighting 和 VXGI 类似,使⽤是基于 3D Clipmap 的⽅式以节省存储空间。但 Lumen 的 VoxelLighting 中的每个 3D 纹素和 VXGI 中的 Voxel 并不相同 ——Lumen 的每个 3D 纹理表⽰的是 Ambient Cube 某⼀个⽅向上的光照投射参数,实际上它所需要的 3D 纹素数量是其 Size 的 6 倍。这⼉可以看到 VoxelLighting 选择了和 MeshCards ⼏乎完全相同的结构 (六⾯体) 和基函数 (AmbientCube)
VoxelLighting 默认使⽤ 4 级 3d Clipmap,存储的是以相机世界位置为中⼼点周围 200 米范围(可配置)的间接光照信息。 所有 MipLevels 和 Directions 均直接平铺在⼀张 3D 纹理中
对场景执行 Voxel Cone Tracing 的第一步是构建场景物体的稀疏体素八叉树(Sparse Voxel Octree),UE5 使用了稀疏 HLOD 的网格距离场
一般使用了混合渲染管线,直接光(Primary ray)使用传统的光栅化获得,次级光则使用椎体追踪在体素椎体追踪之前,会预过滤几何体,然后像参合介质那样去追踪(可使用体积光线投射法)。而体素使用不透明场 + 入射辐射率来代表场景物体,这样可以使用四线性(Quadrilinearly)插值采样来模拟椎体射线覆盖的脚印
越后面的用越大的 MIP,权重也越小,类似 GTAO 和 SSAO
Voxel 的渲染过程可分拆成 3 个 Pass:第一个 Pass 是光照,烘焙辐照度(反射阴影图,RSM);第二个 Pass 是预过滤,使用稀疏八叉树下采样辐射率;第三个 Pass 是相机 Pass,收集每个可见片元(像素)的辐照度。(下图)
把物体中的颜色信息投影到 3d 纹理中,需要注意的是塞入到 3D 纹理中的颜色信息,并不只是物体本身的纹理颜色信息,还需要根据 ShadowMap 计算这点像素是否被遮挡,同时如果该物体有自发光,也需要将自发光计算在内。这样就构建了一个 3D 空间下每个像素下的颜色信息。
需要注意的是,由于一个面上包含的是前后两个面片,为了防止后面的像素被剔除,我们需要 Shader 的剔除关掉将其设置 Cull Off 即可