GPU Gems 2 · Chapter 10. Real-Time Computation of Dynamic Irradiance Environment Maps

把动态环境 map 投影到 spherical harmonics,在频域中与 diffuse/specular reflection coefficients 卷积,再由 GPU 重建可实时采样的 irradiance map。

学习目标

  • 能解释 irradiance environment map 如何把复杂方向光环境折叠成按 normal 的高效 lookup
  • 能说明 spherical harmonics 的 band、coefficient 数量与低频 diffuse lighting 的关系
  • 能把环境投影、频域卷积和 inverse evaluation 映射到 GPU pass 与 tiled lookup texture
  • 能判断 diffuse、glossy、动态环境和 shadowing 之间的近似边界

环境 map 可以把许多方向的光强存成一个球面函数。若每个像素都对所有光源 texel 求 max(0, dot(L, N)),成本与环境分辨率和光源数量相关。把这次积分提前,运行时只需按 normal 查一次。

Many light texels → convolution → one irradiance lookupenvironment mapmany directionsconvolutionL · max(0, N·L)sum / filterfrequencyirradianceN → Bone lookup
irradiance map 把复杂光照环境预先折叠成一次按 normal 的 lookup;动态环境只需重新生成它。

1. 从 spatial domain 到 frequency domain

把环境光表示为系数集合。第 l 个 band 有 2l + 1 个系数,直到某阶的总系数数量是 (l + 1)²。diffuse irradiance 随 normal 变化缓慢,因此低阶已经能捕捉主要形状。

Spatial domain ↔ frequency domainenvironment samplesM × N brute forceSH coefficientsK terms · convolution = multiply
diffuse irradiance 变化缓慢,低阶 spherical harmonics 就能保留主要能量,避免对每个输出 texel 遍历全部输入 texel。

在频域中可通过分别投影、逐项相乘和求和来完成,这就是 convolution theorem。reflection function 的系数是固定的,可以预计算;动态运行时只更新环境的系数。

2. GPU 的两阶段实现

第一阶段是 projection:pixel shader 对输入环境的样本按权重求和,得到每个 (l, m) 的 RGB coefficient。第二阶段把这些 coefficient 乘 reflection function 系数,并在每个输出环境 texel 上做 inverse transform,重建空间 irradiance map。

GPU path:projection → frequency convolution → evaluationProjectenvironmentSHConvolveSH × BRDF coeffEvaluateinverse transformtiled lookup textures 将多个 (l,m) coefficient 组织成并行输出像素
reflection-function 系数可预计算;动态变化只更新环境投影和最终 evaluation。

利用 output pixel 的位置找到对应 tile 和 input offset。这样不必为每个 coefficient 单独提交 pass,能把多个系数组织进一次渲染到纹理流程。

3. 动态环境与 diffuse/specular

Dynamic scene:更新环境,不重做每个表面的积分lights / objectssun · flaremoving actorrender to envGPU updateSH projectconvolveevaluate mapsurfaceNlookupshade
动态环境不再等于离线光照:render-to-texture 加频域压缩让环境 map 能在运行时更新。

只要环境 map 能通过 render-to-texture 更新,后续 projection、convolution 和 evaluation 就可以在 GPU 上实时完成。太阳移动、动态灯光或反射对象改变时,表面不必重新积分所有环境样本,只需重新生成或更新 irradiance map。

diffuse 的低频性质让低阶 SH 很有效;specular 的 gloss 越高,函数越尖,需要更多频率。使用环境 map 的材质还要结合 base color、normal 和可见性 term,不能把所有复杂反射都压成一张低阶 diffuse map。

4. 阴影、插值与可组合系数

环境 map 本身不包含每个表面的动态 occlusion。静态对象可以预计算 ambient occlusion,动态对象则需要额外的实时近似。SH 系数可以逐分量线性插值和相加,因此能够平滑地过渡两个环境或叠加多个低频光照贡献,但这种组合仍继承输入近似的频率上限。

5. 动手实验:band 与预算

调整 SH band,观察 coefficient 数量按平方增长;增加动态光源,观察 projection 需要重新累积更多输入;提高 gloss,思考低阶 approximation 是否仍能保留高频 highlight。实验显示的是预算关系,不是实际 shader 计时。

Dynamic irradiance map 实验

比较 SH band、动态光源和 reflection gloss 对系数预算的影响。

SH projection · 9 coefficientsprojection ops ≈ 54evaluation ops ≈ 72gloss 20% · diffuse uses low bands, glossy needs more detail

coefficients = (band + 1)²。diffuse lighting 可用低阶近似;gloss 越高,频域需要保留更多细节。

小结

  • irradiance environment map 将方向光环境与 diffuse response 的积分折叠为一次 lookup。
  • spherical harmonics 用低频系数表达缓慢变化的 diffuse irradiance。
  • convolution 在频域中变成系数相乘;GPU 通过 projection 和 inverse evaluation 两阶段实现。
  • coefficient tiling 将多个 (l,m) 系数组织成并行纹理输出。
  • 动态 irradiance map 不自动提供局部阴影;gloss 越高,对高频表示的要求越高。

练习

问题 1|复杂度 为什么直接 convolution 的输出 texel 数和输入 texel 数相乘,而 SH 方法能降低成本?

问题 2|band 选择 为什么低阶 SH 适合 diffuse,却可能不适合高 gloss specular?

问题 3|阴影边界 动态 irradiance map 已经更新,为什么仍需要 shadow map 或 AO?

名词解释

本章出现的专业名词,用大白话再讲一遍。

irradiance environment map
按表面 normal 查询的、已卷积环境光的环境纹理。
spherical harmonics
用正交球面基函数和 band coefficients 表示方向函数的方法。
convolution
将环境函数与 diffuse/specular response 结合的积分运算。
coefficient tiling
把多个 SH coefficient 排到纹理 tile 中并行计算的布局。
frequency domain
以基函数系数而非空间采样表达环境函数的表示域。
inverse evaluation
用 SH 系数和基函数重建输出空间环境 map 的过程。

讨论

评论区加载中…