WAFILOG

追寻起源引擎的光与影

起源引擎(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)将连续的光照方程离散化。具体步骤如下:

  1. 面片细分:将地图中的每个brush表面划分为多个patch面片,通过CreateChildPatch()和SubdividePatch()函数实现。
  2. 可见性计算:创建transfer list,通过Ray Casting算法判断哪些面片之间存在光传输路径。可以利用VVIS阶段生成的PVS数据进行粗粒度剔除。
  3. 空间索引:使用空间哈希表索引各个面片,这种技术在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密度或转向其他方法(如光子映射)。

光照贴图在运行时是静态的,无法响应动态光源变化。移动的光源(如手电筒)需要额外的动态光照系统支持。

参考文献

  1. Chris Green. "Efficient Self-Shadowed Radiosity Normal Mapping." SIGGRAPH 2007.
  2. Jason Mitchell, Gary McTaggart, Chris Green. "Shading in Valve's Source Engine." SIGGRAPH 2006.
  3. Groal et al. "Modeling the interaction of light between diffuse surfaces." 1984.
  4. Kajiya. "The rendering equation." 1986.
← 返回首页