概念页
局部反射探针
Localized Reflection Probes
镜面全局光照需要高角分辨率但只关心反射方向附近的小立体角。实时中最流行的方案是在场景中稀疏放置局部环境贴图(反射探针),配合反射代理体做视差校正;它实现简单、快、美术可控,但有拉伸和漏光问题。另有体素锥追踪和平面反射等替代方案(RTR4 11.6–11.6.4 节)。
为什么镜面要另想办法
- 光泽材质的镜面瓣远比余弦瓣窄,需要能表达高频细节的辐射表示;但只需小立体角内的入射光。
- 用 AHD 或 HL2 基存的方向,可当方向光算出粗糙高光,但 AHD 方向在短距离内剧变会让高光不自然变形(可空间滤波方向缓解),HL2 基在切线空间剧变处有类似问题。
- 《教团:1886》用 9–12 个球面高斯表示入射光,配合 Xu 等的近似:假设菲涅耳与遮蔽-阴影项在各高斯支撑内为常数,,NDF 用各向异性球面高斯 (ASG) 建模并有 SG×ASG 积分的高效近似。只能表现中等光泽,游戏设定在 19 世纪伦敦、高度抛光材质少,所以够用。
- 要表现抛光材质,SH 和 SG 都是全局支撑,任何方向都要所有基函数参与,锐利反射需要数千个,既算不起也存不下。
局部环境贴图(反射探针)
- 入射光用环境贴图表示,只需少量查询;稀疏分布在场景中,以空间精度换角分辨率。第 10 章的各种环境贴图镜面技术都可直接用。
- 《半条命 2》最早把环境贴图绑定到空间点:美术放置采样点,预处理从每点渲染立方体贴图,物体用最近的结果;相邻物体可能用不同贴图导致不匹配,允许美术手动指定。
- 小物体从其中心渲染(先隐藏自身)时较准;但通常一个探针服务多个大范围物体,离探针中心越远误差越大。
视差校正与反射代理
Brennan 与 Bjorke 的方法:不把环境当无限远,而当作有限大小的球(半径由用户定)。查询时把反射方向当作从着色点出发的光线与该形状求交,再用"探针中心→交点"的新方向查环境贴图,相当于把环境贴图"固定"在空间中,称视差校正。
flowchart LR P["着色点 p"] -->|"反射方向 r"| X["与代理体求交"] X --> D["新方向 r' = 交点 - 探针中心"] D --> E["用 r' 查探针环境贴图"]
上图:反射光线先打到代理体(球、盒等),再从探针中心指向交点得到真正的查询方向。
- 代理形状称反射代理,应代表渲染进贴图的几何的大致形状;盒子代理与矩形房间完全吻合时可得完美局部反射。也可用平面矩形代理补充高质量细节,代理不必封闭凸。
- 流行原因:易实现、运行快、前向/延迟渲染都可用;美术可直接控制效果和内存(需要更准就多放探针、贴合代理,内存超标就删探针)。
- 光泽材质:用着色点到代理交点的距离(和粗糙度)选预滤波 mip 级,模拟 BRDF 瓣足迹随距离变大。
- 多探针重叠时可用优先级或平滑混合。
问题与缓解
- 代理很少精确匹配几何,反射会不自然拉伸(主要影响高度抛光材质);贴图中反射性物体的 BRDF 是在探针位置评估的,对其他着色点不完全正确。
- 漏光:简化求交错过本该遮挡的局部几何,返回亮区值。可用方向遮蔽缓解;或利用分辨率更高的预计算漫反射光照——把环境贴图除以探针位置的平均漫反射光照去掉低频部分,着色时再乘着色点的漫反射光照。
- 更精确的几何:Szirmay-Kalos 等给探针存深度图并在查找时光线追踪;McGuire 等更高效地追踪,信息不足时切换到后备探针继续。
- 视差校正后 BRDF 瓣在代理上的足迹随位置改变,而预滤波假设核径向对称,因此预滤波略有误差 (Pesce、Iwanicki)。
动态更新探针
- 开放世界昼夜变化或程序生成世界时,离线处理全部探针太慢或无法存储,需运行时渲染并仔细控制开销。一帧可能用几十上百个探针,不可能全部重渲染,也不必:动态物体的反射可交给屏幕空间方法;加载时渲染一些,其余进入视野时逐个渲染。
- 设定每帧预算,只更新固定数量;按到相机距离、距上次更新时间等排序;预算特别小时可每帧只渲染立方体贴图的一个面。
- 快速预滤波:Colbert 与 Křivánek 用重要性采样,约 64 个样本,从带完整 mip 链的立方体贴图采样并启发式选择 mip 以去噪;Manson 与 Sloan 用基函数构造目标核(系数一次性优化),先降采样+简单滤波,再组合 mip 链样本。
- 压缩:Narkowicz 把 HDR 探针高效压缩到 BC6H(半精度浮点)。CPU 吃不消时可离线准备探针的 G-buffer,运行时只做光照和卷积,必要时把动态几何叠画上去。
体素锥追踪做镜面
SVO 或级联版本都可用于镜面,而且比漫反射更划算:镜面瓣窄,通常一个锥就够;粗糙材质反射模糊,可退回反射探针不追踪;近镜面时锥细得像光线,可能看出体素方块,但反射很少被直接看到、又被纹理调制,实践中少有问题;需要完美镜面时用更便宜的其他方法。
平面反射
- 反射面少且为平面时,用常规管线渲染反射图像,可得精确镜面,额外处理后也能做光泽效果。
- 依据反射定律,反射像就是物体关于平面的镜像:可以复制物体变换到镜像位置渲染(光源位置和方向也要镜像),或等价地把观察者位置和朝向镜像到另一侧,只需修改投影矩阵。
- 平面后方的物体不应被反射:在像素着色器中定义与反射面重合的裁剪平面,裁掉原本在镜子后面的几何。
GEA 的视角:光栅化引擎中的反射(卷 II 12.5.5)
- 以光线追踪为核心的引擎里,反射是模拟"免费"附带的;光栅化引擎则有几种做法(卷 II 12.5.5):
- 用环境贴图给光滑物体做周围环境的一般反射(见 环境贴图);
- 镜子等平面的直接反射:把相机位置关于反射面镜像,从镜像视点把场景渲染到纹理,第二遍再贴到反射面上。GEA 以《最后生还者 重制版》(PS4) 的镜子为例。
- 这对应本页「平面反射」一节,GEA 没有讨论反射探针的视差校正和动态更新。
出处
- realtime_rendering_4ed.pdf 第 11 章 Global Illumination
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 12 章 12.5.5 节
相关页面
图形学环境贴图Environment Mapping把球面函数记录在一张或多张图像里、用纹理查找来解码,就是环境贴图。它比其他球面表示占内存多,但解码简单快速,能表达任意高频和任意动态范围。最基本的用法是反射贴图:假设镜面 BRDF,用反射视线向量查表。本页比较经纬度、球面、立方体、双抛物面和八面体等投影。图形学基于图像的光照Image-Based Lighting用纹理数据(通常是相机拍摄的 360° HDR 全景)照明场景称为基于图像的光照。实时引擎常用预滤波的高光立方体贴图(配合 split-sum 近似)处理高光,用辐照度环境贴图或球谐系数处理漫反射。它们只依赖少量光照图元而不需要知道场景其他表面,因此仍属局部光照。图形学屏幕空间反射Screen-Space Reflections屏幕空间反射 (SSR) 沿反射方向在深度缓冲中步进求交,命中后从颜色缓冲读取入射辐射亮度。由于镜面瓣窄、只需反射方向附近的光,屏幕数据比漫反射情况更可能包含所需信息。它最早由 Sousa 等提出,常作为镜面 GI 的第一层,失败时退回反射探针和全局探针(RTR4 11.6.5 节)。图形学动态漫反射全局光照Dynamic Diffuse Global Illumination烘焙动辄数小时,拖慢美术迭代,几何在运行时变化或由用户创建时甚至无法预计算。动态漫反射 GI 方法无需预处理或预处理快到每帧可做,主要有:基于虚拟点光源的反射阴影贴图 (RSM)、光传播体积 (LPV)、体素锥追踪 (VXGI) 以及屏幕空间补充(RTR4 11.5.5–11.5.9 节)。图形学方向遮蔽Directional Occlusion方向遮蔽用比单个 AO 标量更有表现力的方式记录"哪些方向被挡住",例如地平线角、可见性锥(环境孔径)、球面有向距离或球谐。它主要用于面光源和环境光照的软遮蔽,以及凹凸细节自阴影、超大地形等阴影贴图分辨率不够的场合;对点光源,专门的阴影技术质量更好(RTR4 11.4 节)。图形学预计算光照与光照贴图Precomputed Lighting & Light Maps烘焙 (baking) 是把辐射度或路径追踪等离线 GI 结果预先算好存起来,运行时直接查询。静态几何参与预计算并完整交互,动态物体只作接收者。数据可以是辐照度,也可以带方向(SH、H 基、AHD、球面高斯、环境立方体等),存储在光照贴图、顶点或体积/探针中,各有接缝、漏光、内存等取舍(RTR4 11.5.1、11.5.2、11.5.4 节)。图形学纹理压缩Texture Compression固定码率纹理压缩由 GPU 实时解码:减少显存占用、增大有效缓存、降低访问带宽,也能在同样内存下用更大纹理。BC (DXTC) 系列是桌面标准,ETC/EAC、PVRTC、ASTC 用于移动平台。它们都是有损的,压缩慢、解压快;法线贴图需要专门处理。游戏数学投影矩阵Projection Matrix投影矩阵把视景体变换到规范视体(OpenGL 为 [-1,1]^3,DirectX 的 z 为 [0,1]),在那里裁剪更高效。正交投影保持平行线平行、物体大小与距离无关;透视投影让远处变小,产生的深度与观察深度成反比,近平面位置和"反向 z"决定深度精度。图形学剔除技术Culling Techniques剔除 (culling) 是在渲染前尽快去掉对最终图像没有贡献的部分。本页讲几何类剔除:背面剔除(含成簇背面剔除与法线锥)、视锥剔除(层次化、平面掩码)、室内场景的入口剔除,以及牺牲质量换速度的细节剔除和小三角形剔除。更复杂的遮挡剔除见 遮挡剔除。游戏开发 · UE5Lumen 全局光照与反射Lumen Global Illumination & ReflectionsLumen 是 UE5 默认的全动态全局光照 (Global Illumination, GI) 与反射系统:先做屏幕空间追踪,未命中再对"Lumen 场景"做软件光追(有符号距离场)或硬件光追,命中点的光照从按网格离线放置的卡片 (Card) 构成的表面缓存 (Surface Cache) 中查询,表面缓存的直接与间接光照分摊到多帧更新,从而得到无限次漫反射弹射和全粗糙度范围的反射。图形学渲染方程Rendering Equation渲染方程 (Kajiya, 1986) 把"某点接收到的光就是其他点发出或反射的光"写成递归积分,概括了光从光源出发经任意次反弹到达眼睛的所有路径。反射方程是它的受限特例。离线用辐射度 (Radiosity) 或蒙特卡洛路径追踪求解;实时渲染则靠简化和预计算逼近它(RTR4 第 11 章)。