← BACK TO RENDERING
02Rendering

UE5 RDG 体积光插件

沿相机视线做单次散射积分,用 RDG 组织五个 Global Shader Pass,并给出三条遮挡路径。

PROJECT OVERVIEW

项目概况

引擎
Unreal Engine 5.7
语言 / 着色
C++ / HLSL
组织方式
RDG,5 个 Global Shader Pass
散射模型
均匀密度单次散射 + Henyey–Greenstein(g 默认 0.6)
遮挡路径
全局距离场 / 定向包围盒 / 屏幕空间深度
规模上限
16 个矩形光 · 32 个遮挡盒 · 128 次追踪
PROJECT FILM体积光插件效果演示
STACK
Unreal Engine 5.7C++HLSLRDGGlobal ShaderDistance Field
01 / SCATTERING MODEL

视线积分与散射模型

体积光的核心是沿相机视线在介质里取样,把每一段空气接收到的散射光累加起来。这里采用均匀密度、单次散射模型:密度同时控制散射与消光,Henyey–Greenstein 相函数决定散射在不同观察方向上的分布,积分长度取可见表面距离与最大距离中较小的一方,再按指数消光更新透射率。

步进次数只改变采样精度,不改变亮度尺度——单段贡献按实际步长计算。所以提高步数得到的是更平滑的光束,而不是更亮的画面,密度与亮度参数不必跟着重调。

最终合成关系是场景颜色乘透射率,再加上沿视线累计的散射光。三项各管一件事:密度决定介质厚薄,相函数决定方向分布,积分只负责把沿视线的贡献逐段累加起来。

PHASEp(θ) = (1 - g²) / [4π(1 + g² - 2g·cosθ)^1.5]

g 是各向异性。取正值时散射集中在前向,逆光观察时光束更明显;默认 0.6。

EXTINCTIONT = exp(-σt · d)

密度同时进入散射与消光,所以更厚的介质既更亮,也更明显地遮挡后面的场景。

COMPOSITEC = Cscene · T + Σ (σs · p(θ) · L · Tseg)

沿视线逐段累加散射贡献,每一段按自身步长和该段透射率加权。

SYSTEM MAP

五个 Global Shader Pass 的数据流

  1. 01Occlusion

    朝光源准备可见性数据,为步进阶段提供遮挡输入。

  2. 02Ray March

    沿视线步进,逐点累加散射并输出透射率,是整套效果的核心。

  3. 03Filter

    在深度与法线约束下做上采样,抑制物体边缘的漏光。

  4. 04Temporal

    时域积累配合分层抖动,压住条纹与采样噪点。

  5. 05Composite

    与场景颜色合成,结果继续进入 Bloom 和 Tone Mapping。

运行时模块在 PostConfigInit 阶段注册 Shader 路径,通过场景视图扩展在 Motion Blur 之后接入;中间纹理与 Pass 之间的依赖全部交给 RDG 管理。

02 / OCCLUSION

遮挡的三条路径

默认路径朝光源追踪 UE 全局距离场,可以覆盖屏外遮挡,是目前效果最稳的一条。对于距离场难以表达的细小规则几何,可以给物件打标签改用定向包围盒求交;形状复杂的模型仍然走距离场。

屏幕空间深度作为兼容路径保留,它只能表达当前画面里看得见的几何,屏外或多层遮挡会漏光,所以默认关闭,只在需要时手动打开。

步进 Shader 会按局部光源和规则遮挡体的有无去选择编译分支。包围盒先做一次完全遮挡判断;距离场查询复用层级定位,按扣除半个体素后的保守距离推进,并保留最小步长与 128 次追踪上限。局部光源在积分前先按整条视线做保守范围筛选,通过筛选的光源仍然逐点计算遮挡,按光源列表顺序累加。

CONSERVATIVE STEPd' = max(d - halfVoxel, minStep),上限 128 次

扣除半个体素保证不会跳过薄遮挡,上限则避免在空区域无限细采样。

OCCLUDER TAGSVolumetricLightOccluder / VolumetricLightRDG

前者让静态网格按实心包围盒挡光,最多 32 个;后者让矩形光进入体积散射,最多 16 个。

03 / LIGHT SOURCES

Atmosphere 与局部矩形光

光源方向统一约定为「从采样点指向光源」。Atmosphere 模式直接读取索引 0 的太阳方向与大气地面衰减前照度,所以旋转场景里的方向光就能改光束朝向,方向光的颜色和强度也会一并响应——比在插件内部另维护一套方向更贴近日常布光习惯。

自定义模式接收同一约定下的方向、颜色和照度,填 (0,0,1) 表示光源在正上方。局部矩形光按位置、尺寸、单面发射和距离衰减近似空气散射;属性在游戏线程读取后以值类型快照传给渲染线程,渲染线程不直接访问 UObject。

两条路径的规模上限是明确的:最多 16 个有效矩形光、32 个规则遮挡盒。发光材质本身和灯光对物体表面的照明仍由各自设置控制,插件只负责空气中的那部分光感。

04 / FILTERING

低分辨率积分与降噪

遮挡查询是逐采样点做的,积分因此默认在降分辨率下进行,再由上采样补回细节。上采样必须带深度和法线约束,否则物体轮廓会把背景的光糊进来,边缘出现明显漏光。

三个环节配合压住剩下的伪影:分层抖动把采样误差打散成高频噪声,深度过滤剔除落在遮挡物之后的采样,时域积累再把相邻帧的结果累加起来。三者叠加之后,低分辨率积分也能得到连续、稳定的光束。

插件同时提供入射散射、遮挡可见性、积分深度、距离场追踪步数、屏幕空间遮挡纹理和光源朝向等调试视图,调整光束形状或定位漏光时可以直接看中间结果。