在前面的文章中我讲了虚幻4中所使用的反射率方程,其中复杂的部分是 Cook-Torrance BRDF,我们把它带入整个积分,回顾一下完整的反射率方程。
L o ( p , v ) = ∫ H ( k d c d i f f π + k s D ( h ) F ( l , h ) G ( l , v , h ) 4 ( n ⋅ l ) ( n ⋅ v ) ) L i ( p , l ) n ⋅ l d l L_o(p, v) = \int\limits_H (k_d\frac{c_{diff}}{\pi} + k_s\frac{D(h)F(l,h)G(l,v,h)}{4 (n \cdot l)(n \cdot v)})L_i(p,l) n \cdot l dl Lo(p,v)=H∫(kdπcdiff+ks4(n⋅l)(n⋅v)D(h)F(l,h)G(l,v,h))Li(p,l)n⋅ldl
这样复杂的积分是无法求解析解的,只能通过数值计算方法求数值解,在图形领域常用的方法就是“蒙特卡洛积分(Monte Carlo integration)”。对于实时渲染来说,我们还需要祭出我们最常用的两大法宝:预计算和凑合,咳咳,说错了?,近似,approximation!我们还需要另外一个重要的技术,就是 IBL,Image Based Lighting!把它们组装起来:把上面这个积分进行恰当的近似,并将能够预计算的部分使用蒙特卡洛积分求出数值解,以贴图的方式存储起来。在实时渲染的时候,通过采样贴图取得这些预计算值,进行 Shading 计算! 再进一步的说,虚幻4使用 Split Sum Approximation 将上述积分分成两部分进行预计算:
- 一部分的计算结果存储到一个 Cube Map 上,管它叫做“Pre-Filtered Environment Map”;
- 另外一部分的计算结果存储为一张 R16G16 格式的2D贴图,管它叫做:“Environment BRDF”。
【重要提示】 下面的内容需要两个背景知识:蒙特卡洛积分 和 Image Based Lighting,如果你对这两不熟悉,可以先看文章后面一半的基础知识部分。
Split Sum Approximation
下面重点讲一下虚幻4在进行预计算的过程中进行了哪些公式推导和近似。我们先来看一下虚幻4文档中的公式推导的第一步:
∫ H L i ( p , l ) f ( l , v ) c o s θ l d l ≈ 1 N ∑ k = 1 N L i ( l k ) f ( l k , v ) c o s θ l k p ( l k , v ) \int\limits_H L_i(p,l) f(l, v) cos \theta_l dl \approx \frac{1}{N} \sum_{k=1}^{N} \frac{L_i(l_k) f(l_k, v) cos \theta_{l_k}}{p(l_k, v)} H∫Li(p,l)f(l,v)cosθldl≈N1k=1∑Np(lk,v)Li(lk)f(lk,