GAMES104现代游戏引擎 - 渲染中光和材质的数学魔法

文章字数:4769

存在不少东西没有看懂,后续需要再整理一遍。

引言:渲染的本质挑战

本讲探讨现代游戏引擎 rendering 的核心——光、材质与着色器(Shader)的数学关系。这是游戏引擎中最复杂、最精密的系统之一。

渲染的本质是模拟光子的传播:光子从光源发出,经反射、吸收、折射后进入人眼。为了在有限的硬件算力下实时求解这一过程,过去几十年来,全世界的图形学研究者与工程师提出了无数精妙的"hack"(工程妥协),共同构建起了今天的实时渲染技术体系。

渲染方程(The Rendering Equation)

35年前,Kajiya 提出了著名的渲染方程(Rendering Equation),这被认为是图形学中最基础的理论框架:

$$ L_o(x, \vec w) = L_e(x, \vec w) + \int_\Omega f_r(x, \vec w', \vec w) L_i(x, \vec w') (\vec w' \cdot \vec n) d\vec w' $$

其中:

  • $L_o(x, \vec w)$ 是在特定位置$ x $及角度 $\vec w$ 的出射光。
  • $L_e(x, \vec w)$ 是在同一位置及方向发出的光。
  • $\int_\Omega … d\vec w’$ 是入射方向半球的无穷小累加和。
  • $f_r(x, \vec w’, \vec w)$ 是在该点从入射方向到出射方向光的反射比例。
  • $L_i(x, \vec w’)$ 是该点的入射光位置及方向 $ \vec w’ $。
  • $(\vec w’ \cdot \vec n)$ 是入射角带来的入射光衰减。

—— 渲染方程 - 维基百科

核心矛盾:这个方程描述了完美的物理真实,但极其难以实时求解。游戏引擎工程师过去30年的工作,本质上是寻找这个方程的各种工程近似解

实时渲染的三大挑战

实时渲染面临的三大核心挑战:

光的可见性(Visibility To Light)

即阴影(Shadow)问题。判断场景中的点是否能被光源直接照亮,看似简单,实则是图形学中最棘手的难题之一。

光照的复杂性(Complexity of Light)

真实世界的光照来自四面八方的球面空间(Sphere),而不是简单的方向光或点光源。如何处理面光源(Area Light)、环境光(Ambient Light)以及光的不同频率(高频/低频)信息,是巨大的挑战。

即使知道了来自各个方向的光照(球面函数),要计算它与材质BRDF的积分(卷积),计算量也是巨大的。实时情况下,我们无法对球面进行密集采样积分。

间接光照(Global Illumination)

真实世界中,物体表面被光照亮后会成为新的光源(Color Bleeding),光在场景中无限次弹射(Bouncing)。

这导致:

  • 场景中存在无穷多个光源
  • 问题三(间接光)会加剧问题一(可见性)和问题二(光照复杂性)的复杂度

基础渲染管线:早期的工程妥协

在复杂的数学理论面前,早期的图形工程师采用了极为务实的"土办法",通过这些简单的hack,反而奠定了实时渲染的基础。

简化光照模型

将复杂的球面光照分解为三类:

  • 主导光(Dominant Light):方向光/点光源/Spotlight
  • 环境光(Ambient Light):用一个常数代替四面八方的间接光
  • 环境贴图(Environment Map):用Cubemap(6张纹理)捕捉周围环境的高频反射信息

Blinn-Phong 材质模型

经验派的胜利。不追求严格的物理正确,而是基于观察:

  • 漫反射(Diffuse):光线均匀散射,用 $\cos\theta$ 计算
  • 高光(Specular):用幂函数(Power)控制反射波瓣(Lobe)的宽度

缺陷:能量不守恒(Energy Non-conservative),在光线追踪场景下会出现光能爆炸(亮度无限增长)。

Shadow Map 技术

解决可见性问题的经典方案,以空间换时间的核心思想:

  1. 从光源视角渲染一张深度图(Depth Map)
  2. 从相机视角渲染时,将像素投影回光源空间比较深度
  3. 若深度大于Shadow Map中存储的值,则该点在阴影中

关键问题

  • 自遮挡(Self-occlusion):精度不足导致的锯齿,通过加Bias(偏移)解决,但会造成"浮空阴影"(Peter Panning)
  • 采样率不匹配:光源视角与相机视角的采样率差异导致各种Artifact

全局光照(GI)与预计算技术

3A游戏追求真实感,必须解决间接光照。核心思路是预计算(Pre-computation),将离线计算的结果存储起来,运行时直接查询。

球谐函数(Spherical Harmonics, SH)

将定义在球面上的光照函数(球面信号)用傅里叶级数的思想进行压缩:

  • 用一组正交的基函数(类似 $\sin/\cos$ 函数)表示球面函数
  • 只需存储前 $n$ 阶系数(如4个参数 for 1阶,9个参数 for 2阶)即可重建大致的光照方向

优势

  • 压缩率极高:12个参数(RGB×4)即可表达一个点的环境光照
  • 卷积简化:球面上两个函数的卷积(积分)可简化为SH系数的点积
  • 支持Diffuse和Specular:根据精度需求选择不同阶数

Lightmap(光照贴图)

将静态物体的全局光照烘焙到2D纹理(Atlas)中:

  • 参数化(Parameterization):将3D几何展开为2D UV空间
  • 烘焙(Baking):在Light Farm(渲染农场)中进行离线光线追踪计算
  • 运行时:直接采样Lightmap获得间接光,与实时光照叠加

缺点

  • 仅支持静态物体和静态光源
  • 烘焙时间极长(半小时到一小时)
  • 占用大量内存(几十到几百MB)

Light Probe(光照探针)

在空间中散布采样点,每个点存储SH编码的光照信息:

  • 自动化生成:现代引擎自动生成Probe分布(沿玩家路径、几何表面扩张)
  • 动态物体光照:动态物体通过插值周围Probe的光照来着色
  • Reflection Probe:专门处理高频反射,存储高分辨率Cubemap

与Lightmap的权衡

  • Lightmap:精度高,细节丰富(软阴影、Color Bleeding),但仅静态
  • Light Probe:支持动态,可Runtime更新,但精度低,无法表现细腻的接触阴影

基于物理的渲染(PBR)

微平面理论(Microfacet Theory)

将粗糙表面建模为由无数微小镜面(Microfacet)组成:

  • 粗糙度(Roughness):控制微表面法线的分布离散程度
  • 金属度(Metallic):区分金属(反射有色光)和非金属(漫反射为主)

Cook-Torrance 反射模型

现代PBRSpecular的标准模型,BRDF由三项乘积构成:

$$ f_r = \frac{D \cdot F \cdot G}{4(\omega_o \cdot n)(\omega_i \cdot n)} $$
  • D(Normal Distribution Function, NDF):微表面法线分布,最常用 GGX(Trowbridge-Reitz)分布

    • 特性:峰值尖锐(高频表现好),长尾拖尾(低频表现好),类似"高音清脆、低音低沉"的好音箱
  • F(Fresnel Term):菲涅尔项,描述视线与表面夹角接近掠射角(Grazing Angle)时反射增强的现象

    • 经典近似:Schlick近似 $F = F_0 + (1-F_0)(1-\cos\theta)^5$
  • G(Geometry Term):几何遮挡项,计算微表面间的自遮挡(Shadowing-Masking)

    • Smith模型:基于相同的Roughness分布分别计算入射和出射方向的遮挡

Disney Principled BRDF

Disney提出的PBR设计原则,深刻影响了游戏引擎的设计理念:

  1. 直觉性:参数必须符合美术直觉(如"金属度"、“粗糙度"而非物理折射率)
  2. 参数精简:越少越好,通常控制在2-3个
  3. 范围归一:参数最好在 $[0,1]$ 范围内
  4. 鲁棒性:任意参数组合不应产生无效的诡异结果
  5. 创作弹性:允许少量超范围值以实现特殊艺术效果

主流PBR工作流程

  1. Specular-Glossiness(SG)

    • 参数:Diffuse Map + Specular Map(RGB控制Fresnel颜色)+ Glossiness Map
    • 优点:灵活,适合表达彩色金属(如黄金、铜)
    • 缺点:容易设置错误导致能量不守恒
  2. Metallic-Roughness(MR)

    • 参数:Base Color + Metallic Map + Roughness Map
    • 机制:Metallic作为遮罩,在金属(使用Base Color作为Specular)和非金属(Specular为灰色)之间插值
    • 优点:不易出错,符合直觉,工业界主流
    • 缺点:金属与非金属过渡处可能有白边(White Line)Artifact

Image-Based Lighting (IBL)

将环境光照(Environment Map)与PBR材质结合的技术,解决环境光的镜面反射漫反射积分问题。

Diffuse Irradiance Map

  • 预计算:将环境图与Lambertian BRDF(常数)进行卷积,生成低频的漫反射查找图
  • 运行时:根据法线方向直接采样,无需实时积分

Specular Prefiltered Mipmap

  • Roughness分层:将不同Roughness(0到1)的预过滤环境图存储在Cubemap的不同Mipmap层级中
    • Roughness低(光滑):高频信息,存储在高精度Mipmap(低层级)
    • Roughness高(粗糙):低频信息,存储在低精度Mipmap(高层级)
  • BRDF LUT:用2D查找表(Lookup Texture)预计算Fresnel和几何项的积分,参数为 RoughnessCosine Theta

本质:将渲染方程的积分运算完全转化为纹理查找,实现高效的动态环境光照。


阴影技术进阶

Cascade Shadow Maps (CSM)

解决大场景中阴影分辨率不足的问题:

  • 分层级:根据距相机距离,将视锥体划分为多个层级(如0-10m,10-30m,30-100m)
  • 多级Shadow Map:为每个层级生成不同分辨率的Shadow Map,近处高精度,远处低精度
  • ** blend between cascades**:在层级交界处进行平滑插值,避免硬边

代价:需要渲染多次场景(通常是4次),是渲染管线中性能开销最大的模块之一(通常占4-5ms)。

软阴影技术(Soft Shadows)

  • PCF(Percentage Closer Filtering):在Shadow Map上采样邻域深度,进行多重采样模糊,模拟半影
  • PCSS(Percentage Closer Soft Shadows):根据物体距光源的距离(遮挡物距离)动态调整采样核大小,实现距离相关的软硬阴影
  • VSSM(Variance Soft Shadow Map):利用切比雪夫不等式和双通道Shadow Map(存储深度和深度平方),通过方差估算可见性概率,实现快速的近似软阴影

Virtual Shadow Map(虚拟阴影图)

虚幻5引入的新技术,解决CSM空间利用率低的问题:

  • 虚拟分页:将巨大的阴影纹理空间进行虚拟化管理,仅分配和生成实际可见区域的Shadow Map Tile
  • 动态分配:根据相机视角动态决定哪些区域需要高分辨率阴影,实现全场景一致的高精度阴影

现代渲染趋势

实时光线追踪(Real-Time Ray Tracing)

硬件加速(RTX/DRX)使实时光追成为可能:

  • 应用现状:目前主要用于反射(Reflection)阴影,而非完整的GI
  • 未来方向:配合降噪(Denoising)技术,实现实时全局光照(如UE5的Lumen,结合SDF、Voxel、Screen Space GI等多种技术)

Uber Shader 与 Shader 变体

现代引擎面临Shader爆炸问题:

  • Uber Shader:编写一个包含所有功能的超级Shader,通过宏定义(Macro)控制分支
  • Shader Permutation(变体):编译时根据材质属性、光照类型、平台等条件生成所有可能的Shader组合(如165个模板可生成70,000+个具体Shader)
  • 跨平台编译:使用SPIR-V等中间格式,统一翻译到HLSL、GLSL、Metal、PSL等各平台Shader语言

总结

实时渲染技术的发展史,是一部在物理真实与实时性能之间寻找平衡的工程创新史:

  1. 基础时代:通过Blinn-Phong + Shadow Map + Environment Map 的组合,用极简的hack实现了可接受的实时渲染
  2. GI时代:通过Lightmap、Spherical Harmonics、Light Probe等预计算技术,以空间换时间,实现了静态全局光照
  3. PBR时代:基于Microfacet理论和Cook-Torrance模型,建立了统一的材质标准(Metallic-Roughness),实现了物理正确的光照响应
  4. IBL时代:通过预过滤环境图,将复杂的积分运算转化为纹理查找,实现了高效的环境光照
  5. 现代/未来:硬件光追与实时GI技术(Lumen等)正在打破预计算的限制,向着完全动态、完全真实的目标迈进

核心启示:游戏引擎开发不是追求数学上的完美,而是要在有限的算力下,通过合理的假设、简化与预计算,创造出可信且美观的视觉效果。

参考信息

加载中...