转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=535

上一篇“游戏中基于物理的渲染(三)”中详细讲解了microfacet BRDF,本篇将解释目前大部分游戏中所用的BRDF和基于物理的BRDF之间的区别。

这里先回顾一下第二篇中推导出来的公式:

对比

游戏中常用的的反射方程是这样的:

根据第一篇文章所述,实际上是属于反射方程,而不是diffuse,所以应该改成:

其中,是视线方向对法线的反射向量,来自Phong模型。但是上一篇文章所论述的microfacet BRDF中并没有这一项。Blinn-Phong模型的形式和它类似,但用的是更有物理意义的h,也就是microfacet的m。改用Blinn-Phong的话就得到:

第一篇文章提到的Lambert可以发现,diffuse项已经和基于物理的一样了:

所以,现在我们专注于specular项,前面的公式如果只看specular是这样的

比较microfacet specular:

首先,从公式可以看出,游戏中用的应该用表示Fresnel的替换。

第二,上篇文章说过,与粗糙度有关,所以可以认为和Blinn-Phong的功能相似。但是,要把替换成正确的microfacet分布函数,就必须做一个归一化。也就是说,对于任意的视线方向v,微表面投影的面积之和必须等于宏表面投影的面积,数学上就是:

既然这个方程是对任何视线方向都得成立,那么对于特殊情况v = n也得成立:

Blinn-Phong的项如果也要满足这个方程,就得乘上一个归一化系数:

现在剩下的一项,就是:

这个项的物理意义是可见性(遮挡项除以校正因子)。我们修改过的specular模型并不打算包含可见性,所以简单地把这个项设成1就行了,也就是:

实际上,这对于仅包含height field的微表面是成立的(Blinn-Phong的表面分布函数也对应于此,因为所有背面的microfacet都等于0)。当l = n而且v = n的时候等于1, 这对于height field也是正确的(在宏表面的法线方向没有任何遮挡)。对于很斜的视角或者很斜的光线角都趋向于0,这也是正确的(microfacet被其他microfacet遮挡的可能性随着视角的增加而增加)。

经过整理,来自microfacet specular BRDF的几个项都明朗了,于是得到下面的渲染模型:

前面的系数是因为

把diffuse加回去,就得到:

这就是本系列文章最终推出的基于物理的渲染模型。对比原先游戏中使用的模型,计算量增加非常少,但不但保证了保能量,还能让美术更容易调整参数。

本系列最重要的方程已经呈现,下一篇文章将提一些未来的工作,并展示一些基于物理的渲染结果,作为本系列的完结篇。