UE5 RDG 体积光插件
沿相机视线做单次散射积分,用 RDG 组织五个 Global Shader Pass,并给出三条遮挡路径。
项目概况
- 引擎
- Unreal Engine 5.7
- 语言 / 着色
- C++ / HLSL
- 组织方式
- RDG,5 个 Global Shader Pass
- 散射模型
- 均匀密度单次散射 + Henyey–Greenstein(g 默认 0.6)
- 遮挡路径
- 全局距离场 / 定向包围盒 / 屏幕空间深度
- 规模上限
- 16 个矩形光 · 32 个遮挡盒 · 128 次追踪
视线积分与散射模型
体积光的核心是沿相机视线在介质里取样,把每一段空气接收到的散射光累加起来。这里采用均匀密度、单次散射模型:密度同时控制散射与消光,Henyey–Greenstein 相函数决定散射在不同观察方向上的分布,积分长度取可见表面距离与最大距离中较小的一方,再按指数消光更新透射率。
步进次数只改变采样精度,不改变亮度尺度——单段贡献按实际步长计算。所以提高步数得到的是更平滑的光束,而不是更亮的画面,密度与亮度参数不必跟着重调。
最终合成关系是场景颜色乘透射率,再加上沿视线累计的散射光。三项各管一件事:密度决定介质厚薄,相函数决定方向分布,积分只负责把沿视线的贡献逐段累加起来。
p(θ) = (1 - g²) / [4π(1 + g² - 2g·cosθ)^1.5]g 是各向异性。取正值时散射集中在前向,逆光观察时光束更明显;默认 0.6。
T = exp(-σt · d)密度同时进入散射与消光,所以更厚的介质既更亮,也更明显地遮挡后面的场景。
C = Cscene · T + Σ (σs · p(θ) · L · Tseg)沿视线逐段累加散射贡献,每一段按自身步长和该段透射率加权。
五个 Global Shader Pass 的数据流
- 01Occlusion
朝光源准备可见性数据,为步进阶段提供遮挡输入。
- 02Ray March
沿视线步进,逐点累加散射并输出透射率,是整套效果的核心。
- 03Filter
在深度与法线约束下做上采样,抑制物体边缘的漏光。
- 04Temporal
时域积累配合分层抖动,压住条纹与采样噪点。
- 05Composite
与场景颜色合成,结果继续进入 Bloom 和 Tone Mapping。
运行时模块在 PostConfigInit 阶段注册 Shader 路径,通过场景视图扩展在 Motion Blur 之后接入;中间纹理与 Pass 之间的依赖全部交给 RDG 管理。
遮挡的三条路径
默认路径朝光源追踪 UE 全局距离场,可以覆盖屏外遮挡,是目前效果最稳的一条。对于距离场难以表达的细小规则几何,可以给物件打标签改用定向包围盒求交;形状复杂的模型仍然走距离场。
屏幕空间深度作为兼容路径保留,它只能表达当前画面里看得见的几何,屏外或多层遮挡会漏光,所以默认关闭,只在需要时手动打开。
步进 Shader 会按局部光源和规则遮挡体的有无去选择编译分支。包围盒先做一次完全遮挡判断;距离场查询复用层级定位,按扣除半个体素后的保守距离推进,并保留最小步长与 128 次追踪上限。局部光源在积分前先按整条视线做保守范围筛选,通过筛选的光源仍然逐点计算遮挡,按光源列表顺序累加。
d' = max(d - halfVoxel, minStep),上限 128 次扣除半个体素保证不会跳过薄遮挡,上限则避免在空区域无限细采样。
VolumetricLightOccluder / VolumetricLightRDG前者让静态网格按实心包围盒挡光,最多 32 个;后者让矩形光进入体积散射,最多 16 个。
Atmosphere 与局部矩形光
光源方向统一约定为「从采样点指向光源」。Atmosphere 模式直接读取索引 0 的太阳方向与大气地面衰减前照度,所以旋转场景里的方向光就能改光束朝向,方向光的颜色和强度也会一并响应——比在插件内部另维护一套方向更贴近日常布光习惯。
自定义模式接收同一约定下的方向、颜色和照度,填 (0,0,1) 表示光源在正上方。局部矩形光按位置、尺寸、单面发射和距离衰减近似空气散射;属性在游戏线程读取后以值类型快照传给渲染线程,渲染线程不直接访问 UObject。
两条路径的规模上限是明确的:最多 16 个有效矩形光、32 个规则遮挡盒。发光材质本身和灯光对物体表面的照明仍由各自设置控制,插件只负责空气中的那部分光感。
低分辨率积分与降噪
遮挡查询是逐采样点做的,积分因此默认在降分辨率下进行,再由上采样补回细节。上采样必须带深度和法线约束,否则物体轮廓会把背景的光糊进来,边缘出现明显漏光。
三个环节配合压住剩下的伪影:分层抖动把采样误差打散成高频噪声,深度过滤剔除落在遮挡物之后的采样,时域积累再把相邻帧的结果累加起来。三者叠加之后,低分辨率积分也能得到连续、稳定的光束。
插件同时提供入射散射、遮挡可见性、积分深度、距离场追踪步数、屏幕空间遮挡纹理和光源朝向等调试视图,调整光束形状或定位漏光时可以直接看中间结果。