起源引擎(Source Engine)于2000年在SIGGRAPH大会上首次展示,作为GoldSource引擎的继任者,其静态光照系统采用基于辐射度(Radiosity)的预计算方法。本文将从技术层面分析VRAD工具的实现原理和光照贴图的编码方式。
辐射度光传输方程
辐射度算法求解的是漫反射全局光照问题。在漫反射条件下,BRDF退化为常数,这使得渲染方程可以简化:
$$L_o = L_e + \sigma_s \int_A L_i F(x,x') dA(x')$$
其中σs是漫反射Albedo(在VTF材质中对应"$reflectivity"参数),F是几何项,包含可见性、距离衰减和角度关系。这是一个第二类Fredholm积分方程,无法求得解析解,只能通过数值方法求解。
有限元离散化
VRAD采用有限元法(Finite Element Method)将连续的光照方程离散化。具体步骤如下:
- 面片细分:将地图中的每个brush表面划分为多个patch面片,通过CreateChildPatch()和SubdividePatch()函数实现。
- 可见性计算:创建transfer list,通过Ray Casting算法判断哪些面片之间存在光传输路径。可以利用VVIS阶段生成的PVS数据进行粗粒度剔除。
- 空间索引:使用空间哈希表索引各个面片,这种技术在RTXGI 2.0等现代方案中也被采用。
离散化后,连续积分转化为线性方程组:
$$(I - \sigma F)L = L_e$$
其中F是form factor矩阵,L是待求解的辐射度向量。VRAD最多分配16个线程(threadnum)通过GatherLight()函数并行求解这个方程组。
Form Factor计算
Form Factor是辐射度算法的核心,表示两个面片之间的几何关系。VRAD实现了两种计算方式:
面片到微分面片(FormFactorPolyToDiff):基于Philip Dutre的Global Illumination Compendium公式81,适用于近距离的精确计算。
微分面片到微分面片(FormFactorDiffToDiff):基于Pat Hanrahan的课程讲义,当距离大于5倍patch尺寸时可以使用近似公式。
光照贴图处理
求解完成后,光照贴图仍然是粗糙的方块状。VRAD采用自适应超采样进行平滑处理:
通过ComputeLightmapGradients()计算每个采样点的梯度。如果梯度小于0.0625,说明该点与邻近点变化平缓,不需要超采样;否则执行SupersampleLightAtPoint()进行4x超采样。
在半条命2的二十周年更新中,Valve首次将线性插值改为双三次插值(Bicubic),使光照过渡更加柔和。这是自2000年以来首次对该算法的调整。
Radiosity Normal Mapping编码
传统的光照贴图只存储每个像素的总辐射度,丢失了方向信息。当表面带有法线贴图时,凹凸细节无法得到正确的光照响应。
起源引擎采用Radiosity Normal Mapping技术(也称为HL2 Basis),将光照投影到三个正交基底上。在runtime阶段,采样法线贴图的normal向量,分别与三个基向量做点积,加权求和得到该点的静态光照:
$$L_{final} = (n \cdot b_0) L_0 + (n \cdot b_1) L_1 + (n \cdot b_2) L_2$$
这种方法基于半球空间(区别于球谐函数的球空间),能够保留光照的方向性信息,使法线贴图的凹凸细节与静态光照自然结合,呈现自阴影等精细效果。
性能特征
VRAD的编译时间与以下因素相关:
- 面片数量:patch数量决定线性方程组的维度。
- 反弹次数:多次反弹需要迭代求解。
- 光照贴图精度:lightmap scale参数直接影响采样密度。
如果地图存在leak(泄漏),VRAD会为无限大的外部空间计算光照,编译时间急剧膨胀。多线程性能在带有-final参数的室外场景中存在瓶颈,Valve在SDK 2013中提供了修复补丁。
社区存在GPU VRAD项目尝试加速编译过程,但存在较多问题。起源2引擎的VRAD3转向Path Tracing框架,并提供Vulkan硬件光追扩展,大幅缩短了复杂场景的编译时间。
技术限制
辐射度算法假设所有表面都是理想漫反射体,无法处理镜面反射和折射。对于高频光照细节(如尖锐的阴影边缘),需要增加patch密度或转向其他方法(如光子映射)。
光照贴图在运行时是静态的,无法响应动态光源变化。移动的光源(如手电筒)需要额外的动态光照系统支持。
参考文献
- Chris Green. "Efficient Self-Shadowed Radiosity Normal Mapping." SIGGRAPH 2007.
- Jason Mitchell, Gary McTaggart, Chris Green. "Shading in Valve's Source Engine." SIGGRAPH 2006.
- Groal et al. "Modeling the interaction of light between diffuse surfaces." 1984.
- Kajiya. "The rendering equation." 1986.