局部光照

引言:从精确光源到真实世界光照

你好!欢迎来到第10章的学习。在第9章,我们已经掌握了如何用PBR材质(BRDF)和理想化的精确光源(点光源、方向光)来计算着色。但真实世界的光源并非无限小的点,而是有体积面积的。

本章的核心目标,就是将我们的光照模型从处理单一方向的光线,扩展到处理一个区域范围(立体角)内的所有入射光。

  • 核心挑战: 真实光照计算需要对一个区域内的所有入射光进行积分,这在实时渲染中通常计算量过大。
  • 本章思路: 我们将探索各种解析解近似方法来求解这个积分,避免使用昂贵的蒙特卡洛方法(即暴力采样光线)。
  • 两大主题:
    1. 面光源 (Area Lights): 场景中的主要直接光源,如窗户、灯管。需要较高的精度,并与材质属性紧密结合。
    2. 环境光 (Environment Lighting): 模拟来自周围环境的间接光照,如天空光。通常更复杂,但强度较低,因此可以使用更多的近似。

10.1 面光源 (Area Lights)

从点光源到面光源,最本质的区别在于,着色点接收到的光不再来自单一方向 ,而是来自光源所覆盖的整个立体角

核心观点: 点光源是对面光源的一种近似。这种近似带来的视觉误差,主要取决于两个因素:光源的(视觉)大小表面的光泽/粗糙程度

1. 面光源的视觉影响

  • 高光形状: 面光源会在光滑表面上产生有形状和大小的高光,而不仅仅是一个点。光源越大,高光范围也越大。
  • 粗糙度与光源大小的关联: 一个非常有趣的观察是:一个大的面光源照射在光滑表面上的效果,在视觉上类似于一个小的点光源照射在粗糙表面上的效果
    • 实践启示: 这解释了为什么很多老游戏仅用点光源也能做出看起来还不错的效果——美术师通过手动“调糙”材质,来模拟面光源产生的高光模糊效果。
    • ⚠️ 陷阱: 这种做法会将材质与特定的光照条件耦合,一旦光照环境改变,材质表现就会出错。作为引擎开发者,我们的目标是提供物理上更准确的方案,解开这种耦合。

2. 兰伯特表面:一个重要的简化

对于纯漫反射(Lambertian)表面,情况变得简单很多。因为漫反射向所有方向均匀反射光线,我们只需要关心总共接收了多少能量(即辐照度 Irradiance, ),而不用关心每个方向的能量分布。

  • 出射 Radiance:
  • 辐照度积分: 我们需要求解的积分从复杂的BRDF积分简化为了一个余弦项的积分。

3. 向量辐照度 (Vector Irradiance) - 精确的漫反射解决方案

这是一个非常巧妙且强大的数学工具,用于简化面光源对漫反射表面的计算。

  • 核心概念: 向量辐照度 是一个单一向量,它通过对所有方向的入射光线向量(以其Radiance为长度)进行积分而得到。它代表了光能在空间中的“净流动”方向和强度。
  • 关键应用: 对于一个法线为 的表面,其接收到的辐照度 可以通过一个简单的点积直接算出:
  • 重大意义: 这意味着,对于任意形状和大小的面光源,只要它完全位于着色点表面的正半球内(即没有部分在“地平线”以下),我们就可以计算出一个等效的单一方向光来精确地计算其对漫反射的贡献,没有任何误差
  • 转换公式:
    • 等效光方向 :
    • 等效光颜色/强度 :
    • 示例: 对于球形光源,这个方法推导出的等效光源就是一个具有标准平方反比衰减的点光源。

4. 实用技巧与近似 (Hacks & Approximations)

当无法进行精确计算或追求更高性能时,一些非物理但有效的技巧就派上用场了。

  • 环绕光照 (Wrap Lighting):
    • 目的: 模拟面光源光线能“绕”到物体背后的效果,软化明暗过渡线(Terminator)。这在风格化或卡通渲染中尤其常见。
    • 原理: 修改标准的 计算,使其在背光面也能得到一个正值,从而让光照范围扩大。
    • Forsyth 的形式: ( 从0到1控制“环绕”程度)
    • Valve (半条命2) 的形式:

5. 与阴影的联系

关键提醒: 面光源最显著的视觉特征之一就是它能产生柔和的阴影 (Soft Shadows)。如果你的渲染管线实现了面光源的着色模型,但阴影依然是硬的(Hard Shadows),那么面光源带来的真实感提升将大打折扣,甚至会显得不协调。因此,面光源的着色与软阴影技术是相辅相成的。

10.1.1 光泽材质 (Glossy Materials)

当面光源照射到光泽(非漫反射)表面时,情况变得复杂。我们不能再像处理漫反射那样只关心总能量,而是必须考虑光线的方向分布。精确求解这个积分非常困难,因此在实时渲染中,我们几乎总是使用近似方法。

  • 核心问题: 如何在不进行昂贵积分运算的前提下,模拟出面光源在光泽表面上形成的、有形状的高光?
  • 核心思路: 寻找一个等效的精确光源 (Equivalent Punctual Light) 来模拟面光源的效果。我们不改变复杂的BRDF计算本身,而是巧妙地修改传入着色函数的光照参数(如粗糙度或光线方向)。这是一种性价比极高的策略。

近似方法 1: 粗糙度修正 (Roughness Modification)

这个方法的思想非常直观:面光源使高光模糊,增加材质粗糙度也会使高光模糊,那么我们或许可以用一个来模拟另一个。

  • 基本原理: 将光源的立体角(视觉大小)和材质BRDF的镜面波瓣(高光范围)都看作是圆锥体。它们共同作用的结果(卷积),可以近似为一个更大的新圆锥体。这个“更大”就体现在增加的粗糙度上。
  • 关键算法: Karis 在虚幻引擎中为球形光源和GGX材质提出的粗糙度修正公式: 其中 是原始粗糙度, 是修正后的粗糙度, 是球形光源半径, 是到光源中心的距离。
  • 优点:
    • 极其廉价,几乎是零成本。
    • 对于有一定光泽度的表面效果不错。
  • 缺点:
    • 对于镜面材质完全失效,因为它无法产生清晰的光源形状反射。
    • 过度模糊的倾向,尤其对于像GGX这样高光拖尾(tail)较长的BRDF。

近似方法 2: 代表性点 (Most Representative Point, MRP)

这个方法不修改材质,而是去寻找光源表面上“最重要”的一个点,用这个点作为光线方向。

  • 基本原理: 基于数学中的中值定理。一个函数在某个区域上的积分,可以等于这个区域的面积乘以该函数在区域内某一个“代表点”上的值。MRP就是尝试去找到这个最佳的“代表点”。
  • 如何寻找: 我们要寻找能让BRDF贡献最大的那个光线方向。
    • Picott 的方法: 找到光源上与反射向量夹角最小的点。
    • Karis 的改进: 更快的方法是找到光源上离反射光线(一条无限长的射线)最近的点。
  • 视觉效果: 当视线的反射方向扫过面光源时,这个“代表点”也会随之移动,从而有效地“拉伸”和“展宽”了高光,使其呈现出光源的大致形状。
  • 优点:
    • 能更好地保留高光的锐利感,适用于更光滑的表面。
    • 思想通用,可以扩展到多种光源形状。
  • 缺点:
    • 在粗糙表面上,高光可能显得比真实情况更“尖锐”,与粗糙度修正的“过度模糊”正好相反。
  • 进化: 后续有工作(如de Carpentier)针对微表面模型对MRP进行了优化,通过最大化 来寻找代表点,这比原始方法更符合物理。

10.1.2 一般光源形状 (General Light Shapes)

球形光源是一个很好的起点,但现实世界的光源形状各异。

  • 核心权衡 (Trade-off): 在图形学中,我们经常面临一个选择:是为一个简化的理想问题(如球形光源)提供精确解,还是为一个复杂的现实问题(如矩形光源)提供近似解。在实时渲染中,后者往往更有价值。

常见光源形状的解决方案

  • 管状/胶囊光源 (Tube/Capsule Lights):

    • 漫反射: 有精确的解析解,等效于计算线段两个端点处的点光源并进行特殊衰减混合。
    • 镜面反射: 使用MRP方法,找到胶囊体上离反射光线最近的点即可。
  • 平面/多边形光源 (Planar/Polygonal Lights):

    • 这是非常有表现力的一类光源,可用于模拟窗户、屏幕、柔光箱等。
    • Drobot 的 MRP 方法 (针对矩形): 这是一个更复杂的MRP。它通过插值两个关键点来找到最终的代表点:
      1. 最大化 的点(对漫反射最重要)。
      2. 最大化 的点,即离着色点最近的点(对衰减最重要)。
    • 解析方法: Arvo 等人提出了基于轮廓积分的精确解析解,但对于实时渲染来说计算过于昂贵。

现代通用技术: 线性变换余弦 (Linearly Transformed Cosines, LTC)

这是目前业界实现多边形面光源的主流先进技术,兼顾了通用性、准确性和性能。

  • 核心思想: 任何复杂的BRDF波瓣和光源积分,都可以通过一个巧妙的“障眼法”来简化。
  • 工作原理:
    1. LTC: 一个简单的余弦波瓣,可以通过一个 的变换矩阵 对其进行任意的缩放、拉伸、倾斜,从而近似出各种复杂的BRDF形状。
    2. 积分变换: 我们要求解的积分是 ∫ BRDF * Lighting dω。LTC将其近似为 ∫ LTC * Lighting dω。这个积分依然很难。
    3. 关键技巧: 求解 ∫ (M * cos) * Lighting dω很难,但我们可以对积分域(也就是光源多边形)应用逆变换 。这样,积分就变成了 ∫ cos * (M⁻¹ * Lighting) dω。这个新问题——在一个被变换过的多边形上对一个简单的余弦波瓣进行积分——是有已知的、高效的解析解的!
  • 实现流程:
    1. 离线: 预计算一个查找表 (LUT)。输入是BRDF参数(如粗糙度、视线与法线夹角),输出是能够最佳拟合该BRDF的 矩阵 和一些归一化项。
    2. 实时: 在Shader中,根据当前材质和视角,查询LUT得到矩阵 。然后用 的逆矩阵变换光源多边形的顶点,最后调用解析解函数计算光照。
  • 总结: LTC 是一种非常强大和灵活的技术,它将复杂的BRDF积分问题,转化为了一个有高效解析解的几何问题。虽然比简单的MRP成本高,但它提供了对各种形状面光源的、更高质量且通用的解决方案。

10.2 环境光照 (Environment Lighting)

到目前为止,我们处理的光源都有明确的形状和位置。但现实中,光线无处不在,比如来自天空的光,或从地面、墙壁反弹过来的光。这些光共同构成了环境光照

  • 核心思想: 在实践中,我们将光照分为两部分处理:

    1. 直接光: 来自明确光源(太阳、灯泡),通常强度高、范围小。我们用前几节的技术(点光源、面光源)处理。
    2. 间接/环境光: 来自周围环境(天空、物体反弹),通常强度较低,但覆盖整个半球。这是本节的重点。
  • 局部 vs. 全局光照: 需要明确的是,本章讨论的方法仍属于局部光照 (Local Illumination)。我们使用的环境光信息(例如一张天空贴图)是预先提供的“光源图元”,着色计算本身并不知道场景中其他物体的存在。这与需要显式模拟光线在场景物体间反弹的全局光照 (Global Illumination) (第11章) 是有区别的。

最简单的模型: 恒定环境光 (Constant Ambient Light)

这是最基础的环境光模型,也是一个“经典老方法”。

  • 概念: 假设有一个强度恒定为 的光,从所有方向均匀地照射到物体上。
  • 目的: 它的唯一作用就是防止阴影和背光面变成纯黑,为场景提供一个基础亮度,模拟最基本的间接光反弹。
  • 兰伯特表面: 对于纯漫反射表面,恒定环境光的效果就是一个与法线、视角无关的恒定颜色: (其中 是漫反射反照率)
  • 光泽表面: 对于任意BRDF,其贡献为 ,其中 是一个重要的物理量,称为定向反照率 (Directional Albedo)
  • 缺点: 效果非常“平”,因为它忽略了遮挡。一个狭窄的缝隙内部和一个开放的平坦表面会接收到完全相同的环境光,这显然不真实。这个问题引出了环境光遮蔽 (Ambient Occlusion, AO) 的概念,我们将在第11章深入探讨。

10.3 球面函数与半球函数 (Spherical/Hemispherical Functions)

恒定环境光过于简单。真实的环境光(如天空)在不同方向上颜色和亮度都不同。为了表示这种随方向变化的光照,我们需要一个数学工具。

  • 核心概念:
    • 球面函数 (Spherical Function): 一个定义在单位球体表面上的函数。它的输入是一个三维方向,输出是一个值(例如亮度或颜色)。入射环境光 就是一个典型的球面函数。
    • 半球函数 (Hemispherical Function): 只定义在半球上的函数,例如某个表面接收到的光照。
球面基底 (Spherical Basis)

直接存储一个无限高分辨率的球面函数是不可能的。因此,我们选择一组预定义的、更简单的球面函数作为基底 (Basis),然后将我们复杂的目标函数表示为这些基底函数的线性组合(加权和)

  • 类比: 就像任意一个二维向量 都可以表示为基向量 的加权和 一样。

  • 关键流程:

    1. 投影 (Projection): 分析一个复杂的光照环境(如HDR天空图),计算出每个基底函数对应的权重系数。这个过程通常离线完成。
    2. 重建 (Reconstruction): 在运行时(Shader中),使用存储的权重系数和基底函数,来计算出任意方向上的近似光照值。
  • 一个好的球面基底应具备的特性:

    • 高效: 投影和重建的速度要快。
    • 紧凑: 能用很少的系数就很好地近似原函数(高压缩率)。
    • 旋转不变性 (Rotational Invariance): 非常重要! 这意味着对物体(或其法线贴图)进行旋转,等同于对光照系数进行相应的旋转。如果一个基底不具备这个特性,当物体旋转时,光照可能会出现跳变或闪烁的瑕疵。
    • 易于运算: 便于对编码后的函数进行积分、卷积等操作,这些在PBR光照中至关重要。
10.3.1 简单表格形式 (Simple Tabular Forms)

这是最直观、最简单的球面函数表示法。

  • 核心思想: 暴力采样。在球面上选取一系列离散的方向,然后直接存储这些方向上的光照值。可以理解为一个方向到颜色的查找表 (Lookup Table)

  • 常见实现: 环境贴图 (Environment Map),例如 经纬度贴图 (Lat-Long Map)立方体贴图 (Cubemap)。我们将球面“展开”成2D纹理,利用GPU硬件进行快速的采样和双线性插值(重建)。

  • 优点:

    • 简单直观,易于美术师创作和理解。
    • 只要分辨率足够高,可以表示任意高频的复杂光照。
  • 缺点:

    • 内存占用高。
    • 卷积操作昂贵。计算漫反射或粗糙高光需要对环境图进行模糊(卷积),这与采样点数量成正比,实时计算开销巨大。
    • 不具备旋转不变性。当一个反射物体旋转时,低分辨率的环境贴图会导致反射内容在像素间“跳变”,产生瑕疵。
    • 低分辨率下的硬件双线性过滤效果通常很差。
  • 为低频光照设计的表格基底:

    • 环境立方体 (Ambient Cube, AC): 最简单的表格形式之一,可以看作是一个 1x1x6 的立方体贴图。只存储6个主轴方向()的光照值,实时重建时根据方向在这几个值之间插值。非常廉价,但质量较低。
    • 环境骰子 (Ambient Dice, AD): AC的升级版。基底方向沿着一个二十面体的12个顶点,需要存储12个值。重建逻辑稍复杂,但光照过渡更平滑,质量远高于AC。

10.3.2 更强大的球面基底 (Advanced Spherical Bases)

上一节我们介绍了简单的表格形式(如环境贴图),它们直观但存在缺陷。现在,我们将探索更先进的数学工具,它们能更高效、更优雅地表示球面函数。

  • 核心思想: 无论哪种基底,其原理都是将一个复杂的目标函数(如环境光),表示为一组预定义的、更简单的基函数 (Basis Functions)的加权和 (Weighted Sum)。 我们的任务就是为目标函数找到最佳的一组权重

球面高斯 (Spherical Gaussians, SG)

这是一种非常流行且强大的基底,由多个高斯形状的“波瓣 (lobe)”组合而成。

  • 概念: 每个基函数都是一个球面径向基函数 (SRBF),形状像一个高斯钟形曲线,其值仅依赖于计算方向 和波瓣中心方向 之间的夹角。

  • 单个波瓣的数学形式:

    • : 波瓣的中心方向。
    • : 波瓣的尖锐度参数,值越大,波瓣越窄、越亮。
  • 关键优点 (为何SG如此有用?):

    1. 乘积性质: 两个SG函数相乘的结果仍然是一个SG函数。这在光照计算中是天赐的属性,因为光照计算的核心就是 BRDF * Light。如果BRDF和光照都能用SG表示,它们的乘积就能被轻松计算。
    2. 积分性质: 单个SG函数在球面上的积分有简单的解析解。结合第一点,这意味着我们可以解析地计算出光照结果的总能量。
  • 各向异性球面高斯 (ASG): SG的扩展,允许波瓣在不同切线方向上具有不同的尖锐度,可以被“压扁”或“拉伸”,从而能更准确地表示各向异性的BRDF。

  • 主要缺点:

    • 全局支撑 (Global Support): 每个SG波瓣在球面的任意一点上理论值都非零。这意味着,即使我们用 个SG波瓣来表示一个函数,每次重建(计算)一个方向的光照值时,都需要对这 个波瓣全部进行求值和累加,当 较大时开销不菲。

球谐函数 (Spherical Harmonics, SH)

球谐函数是实时图形学中用于表示低频环境光照的基石和工业标准。你可以把它理解为球面上的“傅里叶变换”。

  • 核心概念: SH是一组定义在球面上的标准正交 (Orthonormal) 基函数。

    • 正交 (Orthogonal): 任意两个不同的SH基函数相乘后在整个球面上积分为0。
    • 标准 (Normal): 任意一个SH基函数自己和自己相乘后在整个球面上积分为1。
    • 类比: 就像三维空间中的 轴基向量一样,它们互相垂直(点积为0),且长度为1。
  • 标准正交带来的巨大优势:

    • 投影极其简单: 计算一个目标函数 在某个SH基函数 上的权重系数 ,只需要计算它俩的内积(即函数相乘后在球面上积分)即可。
  • 关键优点 (为何SH如此重要?):

    1. 旋转不变性 (Rotational Invariance): 这是SH的“杀手锏”。对一个用SH表示的函数进行旋转,操作上等价于对它的系数向量进行一次矩阵变换。这意味着我们可以旋转环境光,或者对使用了凹凸贴图的表面进行正确光照,而不会产生任何视觉瑕疵。
    2. 频带 (Frequency Bands): SH基函数按阶 (band) 来组织,阶数越高,表示的函数频率越高(细节越多)。
      • 0阶 (Band 0): 1个函数,是一个常数,代表了环境光的平均值 (DC分量)。
      • 1阶 (Band 1): 3个线性函数。
      • 2阶 (Band 2): 5个二次函数。
      • ...
    3. 紧凑表示低频信号: 像天空光照产生的漫反射 (Irradiance) 这样平滑、低频的函数,用很少的SH系数(如前2阶或3阶,即4个或9个float3系数)就可以非常精确地表示。
    4. 谱域运算: 两个函数的乘积的积分,等于它们各自SH系数向量的点积。这使得计算光照积分变得异常高效。
  • 主要缺点:

    1. 全局支撑 (Global Support): 和SG一样,重建时需要计算所有系数。
    2. 振铃效应 (Ringing Artifacts): 当用有限的低阶SH去表示一个包含剧烈变化(高频)的信号时(比如一个明亮的太阳),重建的结果会在剧变边缘产生类似水波纹的振荡瑕疵。这也被称为吉布斯现象 (Gibbs Phenomenon)。在实践中,通常需要对原始环境图进行预处理(滤波)来缓解此问题。

其他球面表示

除了SG和SH,还有其他一些技术,例如:

  • 球面小波 (Spherical Wavelets): 能够很好地平衡空间局部性(只影响一小块区域)和频率局部性,对于压缩高频信号很有用。

总结: 对于引擎开发者来说,球谐函数 (SH) 是必须深入理解的工具,它构成了现代引擎中间接光漫反射(Irradiance Probes/Volumes)的基础。球面高斯 (SG) 及其变体则因其优秀的数学性质,在学术界和某些特定渲染技术(如预计算光照、体积渲染)中也扮演着重要角色。


我们已经了解了用于表示整个球面光照的基底(如球谐函数SH)。现在,我们将焦点转向那些专门为半球设计的、更高效的表示方法。这对于处理表面光照(BRDF、入射光等)至关重要。

10.3.3 半球基底 (Hemispherical Bases)

  • 核心动机: 对于一个给定的表面,我们只关心其法线方向上半球的入射光。使用SH这样的球面基底来表示半球函数,相当于浪费了一半的存储和计算能力去描述一个永远为零的区域(物体内部)。因此,专门为半球域设计的基底会更加高效和对口。

1. AHD 基底 (Ambient/Highlight/Direction)

这是一种非常直观、简单的半球光照表示方法,在游戏工业界有着悠久的应用历史。

  • 核心思想: 将复杂的半球光照,近似为两个最主要分量的叠加:
    1. A (Ambient - 环境光): 一个恒定的、来自所有方向的环境光。
    2. HD (Highlight/Direction - 高光/方向光): 一个代表最亮方向的、集中的方向光。
  • 数据构成: 通常存储8个浮点数:一个方向向量D(2个参数)+ 两个RGB颜色值(A 和 H)。
  • 应用场景: 非常适合存储烘焙好的、简单的体积光照信息 (Light Probes)。因其在《雷神之锤3》和《使命召唤》系列中的成功应用而闻名。
  • 投影 (Projection): AHD基底是非线性的,这意味着无法像SH那样通过简单的积分来计算系数。在实践中,通常采用启发式算法来寻找最佳的AHD参数,例如先将环境光投影到SH,利用SH系数找到主方向D,再反算出A和H。
  • 小结: 一种紧凑、直观但非线性的基底,适合表示具有一个主方向的简单环境光。

2. 辐射法向映射 /《半条命2》基底 (Radiosity Normal Mapping / Half-Life 2 Basis)

这是由Valve在《半条命2》中引入的一种创新且高效的基底,专门用于存储与法线贴图兼容的预计算漫反射光照。

  • 核心思想: 用三个固定的、相互正交的基向量来对半球进行采样。这三个基向量定义在切线空间 (Tangent Space) 中,并向上方(法线方向)倾斜。
    • 基向量坐标:
  • 工作流程:
    1. 投影/烘焙: 离线计算并存储沿这三个方向 的入射光颜色
    2. 重建/着色: 在运行时,对于给定的(法线贴图扰动后的)表面法线 ,通过对三个存储的颜色值进行加权混合,来重建最终的光照。权重取决于法线 与每个基向量的点积。
  • 优点:
    • 它是一个线性基底,易于处理。
    • 性能非常高。
    • 对于有明显方向性的漫反射光照,其视觉效果优于低阶SH
  • 小结: 一种专为预计算漫反射光照设计的、高效且高质量的线性基底,是游戏开发中的经典解决方案。

3. 半球谐波 / H-Basis (Hemispherical Harmonics)

这类方法的目标是将球谐函数 (SH) 的强大数学特性(如标准正交、旋转不变性)适配到半球域上。

  • 动机: 我们想要一个像SH一样“好用”的工具,但又不想浪费那一半的球体。
  • HSH (Hemispherical Harmonics): 一种直接的适配方法,通过数学变换将整个球面“压”到半球上。
    • 缺点1 - 性能: 这种变换引入了除法和平方根等非多项式运算,使得其实时计算比标准SH更慢
    • 缺点2 - 精度: 变换将球体的一个极点(例如南极)映射到了半球的整个边缘(地平线)。这导致基函数在地平线附近变化极少,从而在掠射角 (grazing angles) 处产生很大的近似误差。
  • H-Basis: 对HSH的改进。它通过混合SH和HSH的部分特性,构建了一个新的、仍然保持正交性但计算效率更高、精度也更好的半球基底。
  • 小结: 一个更偏学术和理论的领域,旨在寻找数学上最完美的半球谐波基底。虽然在实时渲染中不如《半条命2》基底那样普及,但代表了该领域的发展方向。

环境映射是实时渲染中实现真实感反射和光照的基石技术。下面总结这一节的核心内容,重点梳理各种映射方式的演进和优劣。


10.4 环境映射 (Environment Mapping)

  • 核心概念: 环境映射是一种将球面函数(特指来自周围环境的入射光 )存储在一张或多张纹理中的技术。它本质上是上一节提到的**“简单表格形式”**中最强大、最流行的一种实现。
  • 关键假设: 环境光来自无限远处。这意味着对于场景中的任何物体,入射光只与方向有关,与位置无关。
  • 优点:
    • 高表现力: 能够通过提升纹理分辨率来表现任意高频的细节。
    • 高动态范围 (HDR): 能够通过增加每个通道的位数来准确存储真实世界的光照强度。
    • 解码快: 在GPU上查找纹理(重建)的速度极快。
  • 缺点:
    • 内存占用高: 尤其是HDR格式的高分辨率纹理。
最简应用:反射映射 (Reflection Mapping)

这是环境映射最基础、最直观的应用,用于模拟完美的镜面反射

  • 原理: 对于镜面,出射光 就是入射光 沿着完美反射方向 的来光。反射方程被极大地简化了: 其中 ,而 是菲涅尔项。
  • 算法流程:
    1. 计算视线 经过法线 反射后的方向
    2. 用向量 作为“坐标”去采样环境贴图,得到
    3. 乘以菲涅尔项,得到最终的反射颜色。
  • 基于图像的光照 (Image-Based Lighting, IBL): 当环境贴图是使用相机从真实世界拍摄的全景照片时,这种技术就称为IBL。

环境贴图的投影方式对比

将一个球面投影到2D纹理上有多种方法,它们各有优劣。

10.4.1 经纬度映射 (Latitude-Longitude Mapping)
  • 概念: 最早的方法,将球面像世界地图一样展开成一张矩形纹理。
  • 优点:
    • 直观,易于理解和编辑。
  • 缺点:
    • 严重的像素分布不均:在两极(贴图顶部和底部)存在极度拉伸和扭曲,浪费了大量像素来表达很小一块区域,而赤道区域像素又过于拥挤。
    • 滤波瑕疵: 在极点处进行纹理滤波时,会导致明显的瑕疵。
    • 计算稍慢: 查找过程需要 arccosatan2 等三角函数,开销相对较高。
10.4.2 球面映射 (Sphere Mapping)
  • 概念: 贴图看起来像是一张在完美反射的“铬球”上看到的环境倒影。是第一种被图形硬件支持的技术。
  • 优点:
    • 计算比经纬度映射快。
    • 所有奇异点都集中在图像的圆形边缘。
  • 缺点:
    • 视角依赖 (View-Dependent): 球面贴图是基于一个固定的观察方向生成的。如果相机移动,反射就会变形失真。在实践中,通常假设球面贴图和相机绑定,在观察空间中进行计算。
  • MatCap 着色: 一种巧妙的“Hack”。它利用球面映射的视角依赖特性,但查找的向量不是反射方向,而是模型在观察空间中的法线方向。贴图本身预先烘焙了光照和材质信息。这是一种廉价的、实现特定艺术风格材质的技巧,但光照会“粘”在摄像机上。
10.4.3 立方体映射 (Cube Mapping)
  • 概念: 当今的工业标准。将环境投影到一个以物体为中心的立方体的六个面上。
  • 实现: 在GPU中被实现为一种特殊的纹理类型,由6张独立的正方形纹理构成。
  • 优点:
    • 视角无关 (View-Independent): 不会因为相机移动而失真。
    • 采样分布更均匀: 相比前两者,像素浪费少,扭曲小。
    • 硬件原生支持,查找极快: GPU可以直接使用三维的反射向量 作为纹理坐标进行采样,硬件会自动选择正确的面并处理面之间的接缝过滤。
  • 结论: 凭借其速度、质量和强大的硬件支持,立方体贴图是目前实时渲染中环境映射的首选方案。
10.4.4 其他投影方法
  • 双抛物面映射 (Dual Paraboloid Mapping): 使用两张分别覆盖前后半球的抛物面投影图。采样分布均匀,但两图接缝处的过滤处理很困难。
  • 八面体映射 (Octahedral Mapping): 将球面投影到一个八面体上,再展开成一张正方形纹理。
    • 优点: 采样均匀度接近立方体贴图,且可存储于单张2D纹理中,避免了接缝问题。
    • 应用: 当硬件不支持立方体贴图时,这是一个很好的替代方案。它也被用作一种向量压缩技术,用2个数值高效地编码一个3D单位向量。

当然。这一节是现代PBR渲染中实现环境光高光反射的核心,我将为你抽丝剥茧,理清其中的关键技术和思想演进。

10.5 基于图像的高光照明 (Image-Based Specular Lighting)

  • 核心目标: 将之前用于完美镜面的环境映射技术,扩展到能够处理具有不同粗糙度光泽 (Glossy) 表面。我们用来实现这一目标的纹理通常被称为高光探针 (Specular Probe)高光立方体贴图 (Specular Cube Map)

  • 基本思路: 模拟粗糙度最直观的方法,就是对环境贴图进行模糊处理。表面越粗糙,反射就越模糊。

  • 核心挑战: BRDF的镜面反射波瓣(你可以将其想象成模糊所用的“滤镜核”)的形状,不仅取决于材质粗糙度,还受视角表面法线的影响。为所有可能的参数组合都预先生成一张环境贴图是不现实的。因此,我们必须找到高效的近似方法。


10.5.1 预过滤环境映射 (Pre-filtered Environment Mapping)

这是实现IBL高光的经典方法,也是后续更高级技术的基础。

  • 关键简化: 为了让预计算成为可能,我们做出一个重要假设:忽略视角和法线的影响,认为镜面波瓣总是围绕着完美反射方向 径向对称的

  • 巧妙的实现: Mipmap链

    • 我们不为每个粗糙度等级都存一张完整贴图,而是利用立方体贴图的 Mipmap 链 来存储不同模糊程度的环境光。
    • Mip 0: 原始、最清晰的环境贴图,用于粗糙度=0 (完美镜面)。
    • Mip 1: 经过轻微模糊的环境贴图,用于较低的粗糙度。
    • ...
    • 最高级 Mip: 经过极度模糊的环境贴图,用于粗糙度=1 (接近漫反射)。
    • 运行时: 着色器根据材质的粗糙度计算出一个合适的Mip等级,然后采样立方体贴图。GPU的三线性过滤还能在两个Mip等级之间平滑插值,以表现连续变化的粗糙度。
  • 生成预过滤贴图:球面卷积 (Spherical Convolution)

    • 这个“模糊”的过程,在数学上被称为球面卷积。即用镜面波瓣作为核,对环境贴图的每个像素进行积分。
    • 由于无法解析求解,通常离线使用蒙特卡洛积分来计算。为了加速收敛(减少噪点),重要性采样 (Importance Sampling) 是必不可少的,它会根据镜面波瓣的形状来智能地投射采样光线。
  • 固有误差: 这个方法忽略了地平线裁剪 (Horizon Clipping)。当在掠射角度(比如球体的边缘)观察时,部分反射波瓣应该被表面自身遮挡,但该方法没有考虑这一点,会导致掠射角度的反射过亮


10.5.2 微表面BRDF的分裂积分近似 (Split-Integral Approximation)

这是现代PBR引擎(如Unreal, Unity)中IBL高光部分的标准实现方案。它在预过滤的基础上,通过一个巧妙的拆分,更精确地模拟了微表面BRDF。

  • 问题: 简单的预过滤方法只考虑了BRDF中的法线分布函数D项(模糊核),而忽略了物理上同样重要的菲涅尔项 F几何项 G。简单地将一个F项乘在积分外面是不准确的。

  • 解决方案:分裂积分近似

    • 核心思想: 将完整的反射方程近似地拆分为两个可以独立预计算的部分,然后在运行时将它们相乘。
  • 拆分后的两部分:

    1. 第一部分:预过滤环境贴图

      • 内容: 环境光 与BRDF的法线分布 D 项的卷积结果。
      • 实现: 就是我们上面讨论的、存储在立方体贴图Mipmap链中的预过滤环境光。
      • 运行时查找: textureLod(SpecularCubeMap, reflectionVec, roughness)
    2. 第二部分:BRDF查找表 (BRDF LUT)

      • 内容: BRDF自身(包含FG项)在均匀白光环境下的积分。这个结果只与材质属性观察角度有关,与环境贴图本身无关。
      • 实现: 预计算一张2D纹理(LUT)。纹理的U坐标通常是粗糙度V坐标视角与法线的夹角(即 )。纹理中存储的是一个用于计算积分结果的缩放和偏移值
      • 运行时查找: texture(BRDF_LUT, vec2(roughness, NoV))
  • 最终着色流程:

    1. 采样预过滤立方体贴图,得到第一部分的结果 specularIBL
    2. 采样2D BRDF LUT,得到第二部分的结果 specularBRDF
    3. 最终高光贡献 = specularIBL * specularBRDF

10.5.3 不对称和各向异性波瓣

  • 遗留的误差: 即便是强大的分裂积分近似,其第一部分(预过滤环境贴图)依然是基于“镜面波瓣围绕反射方向 径向对称”这个假设来制作的。
  • 物理事实: 真实的微表面BRDF波瓣是围绕半向量 对称的。当视角处于掠射角度时,这会导致波瓣被“拉伸”成非对称形状(相对于 而言)。忽略这种变形是该技术主要的误差来源。
  • 各向异性: 对于各向异性材质(如拉丝金属),其反射波瓣本身就是非径向对称的,需要更复杂的预过滤方案或实时近似技术来处理。

我们已经彻底分析了IBL的高光部分,现在让我们来攻克同样重要的漫反射部分。这部分内容是现代引擎中实现柔和、自然的环境光的基础。

10.6 辐照度环境映射 (Irradiance Environment Mapping)

  • 核心目标: 计算并应用来自环境光照的漫反射部分。
  • 核心概念: 我们需要计算的是辐照度 (Irradiance),即到达表面半球内的所有入射光的余弦加权和。计算结果被存储在所谓的辐照度环境贴图 (Irradiance Environment Map) 中。
与高光贴图的关键区别
特性 (Property)高光环境贴图 (Specular Map)辐照度环境贴图 (Irradiance Map)
查找向量反射向量 (视角相关)表面法线 (视角无关)
存储内容辐射度 (Radiance)辐照度 (Irradiance)
视觉特征从清晰到模糊极度模糊 (低频)
存储需求分辨率较高,需要Mipmap链分辨率极低 (如 32x32 甚至更低)
计算准确性存在近似 (如忽略地平线裁剪)对于理想漫反射表面是精确
  • 如何生成: 辐照度贴图的每一个像素(对应一个法线方向),都是通过对原始高分辨率环境贴图进行一次覆盖整个半球的、范围极广的余弦加权滤波(卷积) 生成的。

10.6.1 球谐辐照度 (Spherical Harmonics Irradiance)

虽然可以用低分辨率的立方体贴图来存储辐照度,但在现代渲染管线中,球谐函数 (SH) 是存储和计算辐照度的首选和标准方案

  • 核心思想: 辐照度是一个非常平滑、极低频的函数,这使得它成为SH的完美应用场景。
  • 关键结论 (Ramamoorthi & Hanrahan):
    • 仅使用前9个SH系数(即0、1、2阶,总共 个),就可以极高精度地表示任何辐照度环境贴图。
    • 对于更柔和的间接光,甚至前4个系数(0、1阶)就足够了。
SH的巨大优势
  1. 极其紧凑: 仅用9个float3(108字节)就能存下整个环境的漫反射信息,远小于一张低分辨率的HDR立方体贴图。
  2. 重建快速: 在Shader中,通过几次向量点积和乘加运算即可重建任意法线方向的辐照度,通常比纹理采样更快,且没有缓存未命中的问题。
  3. 支持动态光源: 向SH光照探针中添加或移除一个解析光源(如点光源、方向光),操作极其简单高效:只需计算出该光源的SH系数,然后直接与环境中已有的SH系数进行向量加减即可。
快速生成SH辐照度:频域卷积
  • 天才的技巧: 生成辐照度的过程,在数学上是“辐射度(Radiance)”与“余弦波瓣”的球面卷积。而信号处理理论告诉我们:

    空间域的卷积 = 频域的乘积

  • 实现流程:

    1. 离线: 将原始高分辨率环境贴图(辐射度)投影为一组SH系数
    2. 离线: 计算出余弦波瓣的SH系数 (这是一组固定的常数)。
    3. 相乘: 将两组系数逐分量相乘,即可得到最终辐照度的SH系数 (此处省略了常数缩放因子)。
    • 这个过程避免了在空间域进行昂贵的暴力采样积分,速度极快。
  • 固有瑕疵: 余弦波瓣在地平线处有个急剧的截断(高频信号),用低阶SH近似会导致振铃效应 (Ringing Artifacts),表现为在明暗交界处出现不自然的亮边或暗带。但在多数柔和光照场景下,此瑕疵并不明显。


10.6.2 其他表示方法

除了SH和立方体贴图,还有一些更简单的模型。

  • 半球光照 (Hemisphere Lighting):
    • 概念: 将复杂环境光简化为只有两个均匀的颜色:来自上半球的天空光 和来自下半球的地面光
    • 快速近似公式: 其中 是表面法线与“天空方向”(通常是世界坐标Y轴正方向)的夹角。
    • 应用: 一种非常廉价,但能提供基本方向感的环境光模型。

我们已经学习完了第10章的主要技术内容。最后这一节非常重要,它帮助我们从“技术实现”的细节中跳脱出来,以一个更宏观、更务实的“引擎开发者”视角,来审视我们所学的知识,并理解它们的局限性。

10.7 误差来源总结与全局视角 (Error Sources & The Big Picture)

我们已经学习了多种局部光照技术,从解析面光源到基于图像的光照(IBL)。在真实的引擎中,这些技术是混合使用的。

  • 现代引擎的混合照明策略:
    • 主要直接光 (Direct Light): 通常使用解析光源模型(如球形光、LTC多边形光)进行计算,并搭配阴影贴图 (Shadow Maps) 来处理遮挡。
    • 其他所有光 (Indirect/Environment Light): 天空光、间接光、补光等,通常使用IBL来表示:
      • 高光部分: 使用预过滤的环境立方体贴图 (Specular Cube Map)
      • 漫反射部分: 使用球谐函数 (SH) 或低分辨率的辐照度贴图。

这种混合策略本身就意味着,我们的最终着色结果是各种近似的组合。理解这些近似带来的误差,对于开发出视觉效果统一、稳定的渲染系统至关重要。


主要的误差来源

1. BRDF 的近似 (BRDF Approximation)

在计算IBL时,我们几乎从不直接对原始的BRDF进行积分,而是使用其近似。

  • 显式近似 (Explicit): 我们用一个数学上更易于积分的模型去拟合真实的BRDF。例如 LTC 技术,就是用一个可变换的余弦波瓣去近似复杂的微表面BRDF。
  • 隐式近似 (Implicit): 我们使用的技术本身就隐含了一个简化的BRDF模型。例如,标准的预过滤立方体贴图,其背后的数学模型仅对径向对称的Phong波瓣是准确的,我们只是“期望”它用于微表面BRDF时看起来效果还不错。
2. 遮挡的简化 (Simplification of Occlusion)

遮挡(阴影)是产生真实感的关键,也是误差的主要来源。

  • 核心原则: “漏光”比“缺光”在视觉上更难以接受。人眼对不该亮的地方亮了,比该亮的地方暗了要敏感得多。
  • 面光源阴影: 现有的实时软阴影技术(第七章)都是“障眼法”,它们无法精确地表现由光源形状所决定的半影区域。我们通常只是算出一个标量的阴影系数去乘以光照结果,这是物理上不正确的。正确的做法是应该将遮挡项放到光照积分的内部去计算。
  • 环境光阴影: 这个问题更难,因为环境光来自四面八方,没有一个明确的“光源方向”让你去生成阴影贴图。这引出了后续章节将要讨论的环境光遮蔽 (AO) 等技术。
3. 物理模型的固有局限 (Inherent Limitations of Physical Models)

我们所用的模型本身就是对现实世界的简化。

  • 无限远环境光: IBL假设环境光来自无限远处,这意味着没有视差 (Parallax) 效果。当物体移动时,反射的内容不会有远近变化,这对于近处的反射物来说是不真实的。
  • 光源的均匀发射: 我们假设面光源的表面上每一点都向所有方向均匀发光。但真实世界的光源,如汽车前灯、舞台射灯、带有蜂巢罩的柔光箱等,都具有极其复杂的方向性发射
    • IES 光源配置文件 (IES Light Profiles): 照明工程学会 (IES) 定义了一种标准文件格式,用于描述真实世界灯具的角度强度分布,可以用来模拟这种复杂的方向性。

核心理念:为最终图像服务 (Core Philosophy: In Service of the Final Image)

作为一名引擎和渲染开发者,这一点至关重要。

  • 视觉连贯性 > 物理精确性: 保证不同光照技术(例如解析光源和IBL探针)之间的过渡平滑、效果统一,往往比追求单一技术的绝对物理精度更加重要。避免用户在场景中移动时,光照效果发生突兀的跳变。
  • 目标是“可信”,而非“真实”: 除非你在做科学可视化或预测渲染,否则我们的最终目标是渲染出令人信服的、具有艺术表现力的图像,而不是100%复现物理世界。
  • PBR是工具,不是枷锁: 基于物理的模型之所以优秀,是因为它们提供了一套符合直觉、易于艺术家掌控的框架,能更容易地创作出可信的视觉效果。我们应该把它当作成就艺术目标的强大工具,而不是被物理公式本身所束缚。

补充阅读和资源

  • 现实世界光照: 推荐了解摄影和电影行业的布光技术,这能为你实现渲染效果提供宝贵的现实依据和艺术灵感。
  • IBL: Paul Debevec 的开创性工作是该领域的必读文献。
  • IES 标准: 在追求高级渲染质量时,了解并支持IES光域网文件,可以让场景中的灯光表现得更加真实。