
光源及其特征
- 四种常见的直接光源:平行光、点光源、面光源和聚光源。观察到的现象是,面光源在同一方向上会产生半影区,而其他三种光源通常只产生全影。原因在于面光源在同一方向发出的光并不只有一条,而平行光、点光源、聚光源在同一方向上只有一条有效光线能到达着色点。
- 光强的量纲差异:平行光提供的是辐照度,单位通常是 lux;点光源、面光源和聚光源提供的是辐射强度,单位是坎德拉。对应到渲染方程,平行光给出的是入射光的辐照度,而其他光源给出的是入射光的辐射强度。将这些量带入渲染方程时,需要把它们转换为入射辐射率以便求解着色结果。
- 对不同光源到着色点的光线贡献:平行光和点光源在某个方向上只有一条光线会对着色点产生贡献,因此在这个方向的光照就不需要做多次积分;面光源由于在着色点处可能有多条光线相交,需要进行积分计算,真实感较高但计算量也大。
面光源在实时渲染中的挑战与方案
- 实时渲染中直接光源的面光照需要对半球面进行积分,这在离线路径追踪中常用,但在实时场景中成本过高。2016年以来,基于 LTC(Linearly Transformed Cosines)的思路成为一种高效的实时代码路径。
- LTC 的核心思路是把复杂的球面分布函数通过一个线性变换矩阵映射到一个简单的余弦分布函数上,从而将原本的高维积分转化为可解析或易于查找的形式。通过给定视角方向与粗糙度等参数,可以计算出一个对 BRDF 积分结果近似等价的矩阵 M,并把不同参数对应的矩阵存放在一个 LUT 中(例如 64×64 的纹理),着色阶段再通过这个矩阵快速得到面光照的近似结果。
- 实现要点:将反射方程在微表面模型下分解为入射光、材质、法线等变量的关系,借助 LTC 将 D、F、G 等项简化为一个可用矩阵近似的形式VSport。通过离线计算得到矩阵 M 的多组取值,并以 α(粗糙度)和入射向量关系的离散组合存储在 LUT 中。在实际着色时,给定视角方向和粗糙度即可查表得到近似的 BRDF 积分值,再乘以入射光强度 L 得到最终的颜色输出。
环境光(基于图片的光照,IBL)与分层近似
- 环境光的表示通常使用立方体贴图来描述,环境光被视为来自无限远的光照。不同物体在同一环境中的照明条件可以统一用同一环境贴图来近似计算。
- IBL 的两阶段近似 Split Sum
- 漫反射项:对非金属材质,漫反射分量在远场环境光中可以相对简单地处理。金属材质通常对漫反射的贡献较小甚至可以忽略。把漫反射项分离出来后,可以用一个 Irradiance 立方体贴图来表示从各个法线方向入射的漫反射光强,着色时把法线方向映射到贴图取样并乘以材质的漫反射常数即可得到漫反射着色。
- 镜面项:镜面分量用 Cook–Torrance 风格的 BRDF 表达。Split Sum 提供两阶段的近似:
- 第一步对 BRDF 在半球上的覆盖区域进行模糊化处理,得到一个与 BRDF 覆盖范围相关的预计算结果(相当于一个环境光的粗糙度相关近似)。这个过程本质是在对光源贡献进行滤波。
- 第二步将 BRDF 的其余部分再拆分成一个与粗糙度和入射角相关的二维查找表(LUT),通常以粗糙度和视线夹角余弦值为坐标。第一步的结果与第二步的 LUT 相乘,就能给出镜面反射在当前像素处的近似着色值。
- 实现上的常见做法包括:对环境贴图进行预过滤(prefiltering),得到适合不同粗糙度的环境贴图级别(类似多分辨率的 mipmap),以及一个用于 BRDF 整积分的二维 LUT。最终在着色阶段,使用法线方向从立方贴图获取入射光强,再结合漫反射和镜面反射两部分的近似结果得到综合的环境光照颜色。
- 这种分层近似使得基于图片的环境光照在实时渲染中具有较高的效率,同时保留了金属与非金属材质在不同粗糙度下的物理特性差异。通过对漫反射和镜面反射两部分分别处理,能在较低开销下实现接近真实的结果。
要点回顾与应用启示
- 实时渲染对直接光照的近似需要在精度与性能之间找到平衡,LTC 与 Split Sum 等方法提供了可重复使用的通用思路:通过将复杂的 BRDF 及其球面对的积分转化为可查找的矩阵、 LUT 或预过滤的贴图,从而在保持视觉效果的前提下实现高效计算。
- 这类方法在阴影处理、面光源渲染和环境光照的分层实现中都有广泛的应用,理解其中的近似原理和实现要点,有助于在不同场景和硬件条件下做出更合理的权衡与优化。
