中EN
概念页

动态漫反射全局光照

Dynamic Diffuse Global Illumination

烘焙动辄数小时,拖慢美术迭代,几何在运行时变化或由用户创建时甚至无法预计算。动态漫反射 GI 方法无需预处理或预处理快到每帧可做,主要有:基于虚拟点光源的反射阴影贴图 (RSM)、光传播体积 (LPV)、体素锥追踪 (VXGI) 以及屏幕空间补充(RTR4 11.5.5–11.5.9 节)。

为什么需要动态方案

烘焙耗时长,美术常同时处理多个关卡以免空等,又让烘焙资源过载、进一步变慢,影响效率;有时几何在运行时改变,根本无法预计算。

虚拟点光源与反射阴影贴图 (RSM)

  • Instant Radiosity(与辐射度关系不大):从光源投射光线,在每个击中点放一个代表该表面间接光的虚拟点光源 (VPL)。
  • Tabellion 与 Lamorlette(《怪物史莱克 2》,离线):先做直接光 pass 存入纹理,渲染时追踪光线用缓存光照算一次反弹;表明很多情况下一次反弹就足够可信。
  • RSM (Dachsbacher 与 Stamminger):像阴影贴图一样从光源视角渲染,但除深度外还存反照率、法线、直接光通量;最终着色时把 RSM 纹素当点光源提供一次反弹。RSM 有数十万像素,只按重要性启发式选一部分。后续改进反过来:从整张 RSM 生成一批光源,在屏幕空间溅射 (splatting)。
  • 主要缺点:间接光没有遮挡,但多数应用可接受。
  • VPL 太少会在 RSM 重新生成时剧烈移动造成闪烁,太多又太慢。《神秘海域 4》(Xu) 给玩家手电筒做间接光:每像素只用 16 个光,但多帧轮换不同光集并做时间滤波。
  • 补遮挡:Laine 等给间接光用双抛物面阴影贴图,逐步加入,每帧只渲染少量阴影贴图;Ritschel 等用点表示的简化场景渲染大量不完美阴影贴图,单张缺陷多,简单滤波后足以给间接光遮挡。
  • 相关游戏做法:《Dust 514》渲染最多四层的俯视图来收集间接光;虚幻引擎 Kite 演示用类似方法提供地形间接光。

光传播体积 (LPV)

Kaplanyan 受辐射传输中离散坐标法启发:

flowchart LR
  A["RSM 找到被直接照亮的表面"] --> B["注入: 反射辐射亮度写入所在网格单元<br/>二阶 SH, 朝向背离表面, 带材质颜色"]
  B --> C["传播: 每个单元收集六邻居的辐射场<br/>更新自己的分布"]
  C -->|"每次只传播一格, 迭代多次"| C
  C --> D["着色: 每单元有完整辐射场<br/>可用任意 BRDF"]

上图流程:先用 RSM(或其他方法)找到被照亮的单元注入反射光,再多次迭代让光一格一格扩散,最后按单元的辐射场着色。

  • 优点:每个单元都有完整辐射场,可用任意 BRDF(但二阶 SH 下光泽反射质量较低)。
  • 级联 LPV (Kaplanyan 与 Dachsbacher):嵌套的一组体积,单元逐级变大,各级独立注入和传播,查找时取最精细的可用级别,以覆盖更大范围、传播更远并控制内存。
  • 遮挡:原版没有;改进版用 RSM 深度和相机深度缓冲加入阻挡信息(不完整),也可预处理体素化场景。
  • 问题:漏光最严重;提高分辨率要更多迭代才能传播同样距离,代价大增,平衡不易。网格分辨率有限加上粗糙的方向表示,信号在单元间传递时退化,多次迭代后会出现对角条纹等混叠,可在传播后做空间滤波缓解。

体素锥追踪 (VXGI)

  • Crassin 提出:几何存成稀疏体素八叉树 (SVO),它像 mipmap 一样能快速测试一块空间的占用。体素还存反射光,按六个主方向存储;用 RSM 把直接光注入最底层,再向上传播。
  • 估计入射光时,用沿平均方向追踪的一个锥代替一束光线:沿锥轴一系列查找,每次读取节点尺寸与该处锥截面相当的层级(类似三线性过滤在两层间插值),得到朝锥原点方向的过滤辐射亮度和占用比例。像 alpha 混合一样累计遮挡:每步按占用比例衰减,累加的光乘以累计遮挡。无法检测由多个部分遮挡叠成的完全遮挡,但结果可信。
  • 漫反射要追踪多个锥,数量是性能与精度的折中;假设余弦在锥内为常数,漫反射就是各锥结果的加权和。
  • 虚幻引擎原型版 (Mittring):降低分辨率追踪、空间分布锥使每像素只追踪一个锥,再在屏幕空间滤波得到完整漫反射。
  • 性能问题:查找叶节点是一连串相互依赖的内存读取(每次可能数百周期),ALU 工作很少,GPU 用多 warp 隐藏延迟也常出现全部 warp 都在等内存。McLaren(《明日之子》,30 FPS)改用级联三维纹理:各级尺寸相同、覆盖范围逐级增大,一次普通纹理查找即可、无依赖读取;存反照率、占用和六方向反弹光;级联随相机移动,物体进出高分辨率区,因内存限制按需体素化。

屏幕空间与其他方法

  • 屏幕空间漫反射 GI 不如 SSAO 流行:颜色渗透常来自强光照亮的大片同色表面,往往无法完整入画,反弹光随取景强烈变化、随相机移动闪烁。因此只用于在主方案分辨率之下补充细尺度,如《量子破碎》用辐照度体积做大尺度 GI,屏幕空间方案做短距离反弹。
  • Bunnell 的圆盘 AO 方法也可扩展:每个圆盘再存反射辐射亮度,收集时构建完整入射辐射函数,之后同样要一步去除被遮挡圆盘的光。

方法对比

方法遮挡主要问题典型使用
RSM / VPL无(需额外方案)VPL 少则闪烁、多则慢《神秘海域 4》手电筒
LPV部分(改进版)漏光、迭代代价、对角条纹级联版用于大范围
VXGI(SVO)有(累计近似)依赖读取导致停顿虚幻原型
级联体素纹理有按需体素化开销《明日之子》
屏幕空间局限依赖取景、不稳定《量子破碎》细尺度补充
  1. realtime_rendering_4ed.pdf 第 11 章 Global Illumination

相关页面

图形学渲染方程Rendering Equation渲染方程 (Kajiya, 1986) 把"某点接收到的光就是其他点发出或反射的光"写成递归积分,概括了光从光源出发经任意次反弹到达眼睛的所有路径。反射方程是它的受限特例。离线用辐射度 (Radiosity) 或蒙特卡洛路径追踪求解;实时渲染则靠简化和预计算逼近它(RTR4 第 11 章)。图形学预计算光照与光照贴图Precomputed Lighting & Light Maps烘焙 (baking) 是把辐射度或路径追踪等离线 GI 结果预先算好存起来,运行时直接查询。静态几何参与预计算并完整交互,动态物体只作接收者。数据可以是辐照度,也可以带方向(SH、H 基、AHD、球面高斯、环境立方体等),存储在光照贴图、顶点或体积/探针中,各有接缝、漏光、内存等取舍(RTR4 11.5.1、11.5.2、11.5.4 节)。图形学预计算辐射传输Precomputed Radiance Transfer预计算传输 (PRT) 假设几何不变、只有光照变化,预先计算"输入光照 → 场景辐射亮度分布"的传输函数,运行时注入直接光再应用传输。它依赖光传输的线性性:各"基础光源"的单位响应按当前强度加权求和即得完整反弹光照。变体包括 Sloan 的 SH 环境光 PRT、点光源簇 PRT,以及 Enlighten 一类的表面间传输(RTR4 11.5.3 节)。图形学阴影贴图Shadow Mapping阴影贴图 (Williams, 1978) 先从光源位置渲染深度,再从相机渲染时把每个点到光源的距离与贴图中存的深度比较:更远就在阴影中。它开销可预测(生成约与图元数成线性、查询为常数时间),非常适合 GPU,是任意表面阴影最常用的算法。主要问题是分辨率、深度精度带来的混叠、阴影痤疮和漏光。图形学环境光遮蔽Ambient Occlusion环境光遮蔽 (AO) 是余弦加权后半球上未被遮挡的比例,用来在光照缺乏方向变化时仍给出形状线索(缝隙变暗)。它由 Landis 在 ILM 为《珍珠港》开发,可离线烘焙,也可在物体空间或屏幕空间动态计算(SSAO、HBAO、GTAO 等)。AO 适合漫反射和平滑环境光,不适合点光源或小面光源的可见性(RTR4 11.3 节)。图形学GPU 并行架构GPU Parallel ArchitectureGPU 为吞吐量而设计:芯片大部分面积是成千上万个着色器核心,而不是缓存和控制逻辑。它靠在大量线程组 (warp/wavefront) 之间快速切换来隐藏访存延迟,用 SIMD 让一组线程锁步执行同一条指令。理解占用率和线程分歧,是写出高效着色器的关键。图形学局部反射探针Localized Reflection Probes镜面全局光照需要高角分辨率但只关心反射方向附近的小立体角。实时中最流行的方案是在场景中稀疏放置局部环境贴图(反射探针),配合反射代理体做视差校正;它实现简单、快、美术可控,但有拉伸和漏光问题。另有体素锥追踪和平面反射等替代方案(RTR4 11.6–11.6.4 节)。图形学体素Voxels体素是"体积元素",表示均匀三维网格中的一块空间,位置由网格索引隐含。体素是存储体积数据的传统方式,可存占用位、密度、颜色、法线、有向距离等。数据量按分辨率立方增长,常用稀疏体素八叉树 (SVO) 等结构压缩;可由 GPU 体素化生成,并通过光线投射、转多边形、移动立方体或等值面/水平集光线追踪来渲染(RTR4 13.10 节)。游戏开发 · UE5Lumen 全局光照与反射Lumen Global Illumination & ReflectionsLumen 是 UE5 默认的全动态全局光照 (Global Illumination, GI) 与反射系统:先做屏幕空间追踪,未命中再对"Lumen 场景"做软件光追(有符号距离场)或硬件光追,命中点的光照从按网格离线放置的卡片 (Card) 构成的表面缓存 (Surface Cache) 中查询,表面缓存的直接与间接光照分摊到多帧更新,从而得到无限次漫反射弹射和全粗糙度范围的反射。

被这些页面引用1 篇

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原