基于物理的BRDF

From KlayGE
Revision as of 10:46, 30 December 2010 by Gongminmin (Talk | contribs)

Jump to: navigation, search

引言

基于物理的渲染已经提出好多年了,但在游戏中使用的渲染模型仍然是拼凑出来的经验公式(比如Phong)。这些拼凑的模型如果要渲染高质量的图像, 就需要繁复地调参数。而基于物理的、保能量的渲染模型可以很容易地建立出在不同光照环境下都接近真实的材质来。

神奇的是,基于物理的模型并不会比传统上拼 凑的模型更难实现,计算量也差不多。

反射方程

游戏中最常使用的渲染模型描述的是反射,不考虑SSS等。反射方程可以表示成:

LaTeX: L_0(\mathbf{v})=\int_{\Omega} \rho(\mathbf{l},\mathbf{v}) \otimes L_i(\mathbf{l}) (\mathbf{n} \cdot \mathbf{l}) d\omega_i

其中,LaTeX: \rho(\mathbf{l},\mathbf{v})表示BRDF,LaTeX: L_i(\mathbf{l})表示光源给的贡献,LaTeX: (\mathbf{n} \cdot \mathbf{l})表示光源和表面法线的夹角。这个积分的结果就是所有光源对一个点的贡献之和。

Diffuse项

最简单的一个BRDF就是Lambert,在游戏中就是用LaTeX: (\mathbf{n} \cdot \mathbf{l})来表示。但实际上,LaTeX: (\mathbf{n} \cdot \mathbf{l})是属于反射方程的一项,而Lambert则是一个常量:

LaTeX: \rho_{lambert}(\mathbf{l},\mathbf{v})=\frac{\mathbf{c}_{diff}}{\pi}

精确光源

游戏中经典的光源有point, directional和spot,这些局部光源都可以抽象成“精确光源”的概念,表示一个方向确定、大小为无穷小的光源。由于要计算的是到达表面点时的光照,所以不考虑从光源到表面之间的衰减。因此,精确光源都可以用颜色LaTeX: \mathbf{c}_{light}和光源方向向量LaTeX: \mathbf{l_c}这两个参数来表示。光源颜色LaTeX: \mathbf{c}_{light}的确切定义是,白色的Lambert表面被平行于表面法线(LaTeX: \mathbf{l_c}=\mathbf{n})的光照照亮的颜色。

如何计算这个光源对点的贡献呢?这里需要先引入一个叫做微面光源的概念。顾名思义,微面光源是一个非常小的面光源,中心是LaTeX: \mathbf{l_c},张角是LaTeX: \varepsilon。该微面光源照亮表面的一个点可以用LaTeX: L_{tiny}(\mathbf{l})来表示。它有两个性质:

LaTeX: \forall\mathbf{l}|\angle(\mathbf{l}, \mathbf{l_c})>\varepsilon, L_{tiny}(\mathbf{l})=0
LaTeX: if \mathbf{l_c}=\mathbf{n}, \mathbf{c}_{light}=\frac{1}{\pi}\int_{\Omega} L_{tiny}(\mathbf{l}) (\mathbf{n} \cdot \mathbf{l}) d\omega_i

第一个性质表示如果入射方向和LaTeX: \mathbf{l_c}的夹角大于LaTeX: \varepsilon, 那么亮度为0。第二个性质是从LaTeX: \mathbf{c}_{light}的定义而来,白色表面使得LaTeX: \mathbf{c}_{diff}=1,结合上文所说的反射方程和Lambert,就可以得出性质二。由于LaTeX: \mathbf{c}_{light}要求LaTeX: \mathbf{l_c}=\mathbf{n},所以LaTeX: \mathbf{c}_{light}也表示了当LaTeX: \varepsilon趋近 于0的时候的极限,也就是

LaTeX: if \mathbf{l_c}=\mathbf{n}, \mathbf{c}_{light}=\lim_{\varepsilon \to 0}(\frac{1}{\pi}\int_{\Omega} L_{tiny}(\mathbf{l}) (\mathbf{n} \cdot \mathbf{l}) d\omega_i)

因为LaTeX: \mathbf{l_c}=\mathbf{n}而且LaTeX: \varepsilon \to 0,我们可以认为LaTeX: \mathbf{n} \cdot \mathbf{l}=1,所以得到:

LaTeX: \mathbf{c}_{light}=\lim_{\varepsilon \to 0}(\frac{1}{\pi}\int_{\Omega} L_{tiny}(\mathbf{l}) d\omega_i)

也就是

LaTeX: \lim_{\varepsilon \to 0}(\int_{\Omega} L_{tiny}(\mathbf{l}) d\omega_i) = \pi \mathbf{c}_{light}

把微面光源带入一般的BRDF,得到的就是当趋近于0时的极限:

LaTeX: L_0(\mathbf{v})=\lim_{\varepsilon \to 0}(\int_{\Omega} \rho(\mathbf{l},\mathbf{v}) \otimes L_{tiny}(\mathbf{l}) (\mathbf{n} \cdot \mathbf{l}) d\omega_i)=\rho(\mathbf{l_c}, \mathbf{v}) \otimes \lim_{\varepsilon \to 0}(\int_{\Omega} L_{tiny}(\mathbf{l}) d\omega_i)(\mathbf{n} \cdot \mathbf{l_c})

所以

LaTeX: L_0(\mathbf{v})=\pi \rho(\mathbf{l_c}, \mathbf{v}) \otimes \mathbf{c}_{light} (\mathbf{n} \cdot \mathbf{l_c})

入你所见,刚才引入的微面光源已经从公式中消失,剩下的部分又回到了熟悉的几个项。

Microfacet BRDF

大多数基于物理的specular BRDF的基础是microfacet理论。这个理论是用来描述来自于一般表面(不是光学平滑的)的反射。Microfacet理论的基本假设是,表面是由很多微平面(microfacet)组成,这些微平面都太小了,没有办法一个一个地看到;并假设每个microfacet都是光学平滑的。

每个microfacet把一个入射方向的光反射到单独的一个出射方向,这取决于microfacet的法向m。当计算BRDF的时候,光源方向l和视线方向v都得给定。这意味着在表面上的所有microfacet中,只有刚好把l反射到v的那部分对BRDF有贡献。在下图中,我们可以看到这些有效microfacet的表面法向m正好在lv的中间,也就是h

并不是所有m = h的microfacet对反射都有贡献。有些microfacet会在光源方向l被其他microfacet阻挡(shadowing),有些会在视线方向v被阻挡(masking),也可能都有。Microfacet理论假设所有被遮挡的没有对BRDF的贡献。Microfacet的specular BRDF可以表达成:

LaTeX: \rho(\mathbf{l}, \mathbf{v})=\frac{F(\mathbf{l},\mathbf{h})G(\mathbf{l},\mathbf{v},\mathbf{h})D(\mathbf{h})}{4(\mathbf{n} \cdot \mathbf{l})(\mathbf{n} \cdot \mathbf{v})}

LaTeX: F(\mathbf{l}, \mathbf{h})有效microfacetm = h)产生的Fresnel反射。LaTeX: G(\mathbf{l}, \mathbf{v}, \mathbf{h})是有效microfacet中没有被shadow或mask的比例。LaTeX: D(\mathbf{h})是microfacet的法线分布函数,或者说,microfacet的法线等于h的密度。最后,分母LaTeX: 4(\mathbf{n} \cdot \mathbf{l})(\mathbf{n} \cdot \mathbf{v})是个校正因子,用来校正从microfacet的局部空间转到整体表面的数量差异。

Fresnel项

Fresnel反射项计算从光学平滑的表面反射的比率。它的值取决于两件事情:入射角(光源方向和表面法线之间的角),以及材质的折射率。Schlick近似的Fresnel项是:

LaTeX: F_{Schlick}(\mathbf{c}_{spec}, \mathbf{l}, \mathbf{h})=\mathbf{c}_{spec}+(1-\mathbf{c}_{spec})(1-(\mathbf{l} \cdot \mathbf{h})^5)

其中LaTeX: \mathbf{c}_{spec}是specular颜色。

法线分布项

在大部分表面上,microfacet的方向不是均匀分布的。Microfacet的法线越接近宏表面的法线,就越光滑。这个分布由microfacet的法线分布函数D(m)来定义。函数D()决定了specular高光的大小、亮度和形状。 法线分布函数一般有类似于“粗糙度”这样的参数(各向异性的函数通常有两个参数)。

遮挡项(shadowing-masking term)

遮挡项G(l, v, h)也经常称为几何项。在很多情况下,遮挡项在某种程度上抵消了microfacet方程中的LaTeX: (\mathbf{n} \cdot \mathbf{l})(\mathbf{n} \cdot \mathbf{v})分母,替换成类似于LaTeX: max(\mathbf{n} \cdot \mathbf{l}, \mathbf{n} \cdot \mathbf{v})这样的形式。遮挡项对BRDF保能量是很重要的——没有这个项的话,BRDF反射出的能量可能比接收到的更多。 Microfacet BRDF中很重要的一个事情是把能量从l反射到v的microfacet面积之和(有效面积)和宏表面总面积之间的比例。如果不考虑遮挡,那么有效面积可能会超过总面积,这回造成BRDF不保能量,甚至可能会很明显,如下图所示:

遮挡

在上半部分,平的宏表面为绿色,粗糙的微观表面为蓝色。m = h的microfacet标记为红色。宏表面投到视线方向就是左上角的绿线。同时,投出来的单个红色的microfacet显示成独立的红线。左下图表示在没有遮挡项的情况下,红色的microfacet加起来的面积,结果就是有效面积大于总面积,所以BRDF的反射能量错误地大于了接收能量。右下图里红色区域考虑了遮挡,重叠的区域不再计算多次,所以有效面积小于总面积。