最近在学习LearnOpengl,经过不懈的努力,终于阅读到了PBR的章节,接下来会写一系列博客来总结自己从中学到的理论,并尝试实现其中的算法。
PBR,全称为Physically Based Rendering,是一套尝试用物理的方式来描述现实中渲染效果的技术。相比于前人提到的Phong光照模型,利用PBR的方式可以渲染出更为真实的场景。
利用Phong模型和PBR的效果有一个很直观的对比,上图是古剑奇谭一的游戏截图,它的人物渲染是利用的很基础的Phong模型(甚至可能没怎么看到高光的成分),下图是古剑三的效果,采用了PBR后可以明显看到人物身上闪烁的配饰、衣服布料的材质,相比于古剑一是翻天覆地的变化,甚至在一定程度上逼近了真实的物理世界。
微面元模型
关于PBR,最基础的概念就是微面元模型(Microfacet Model)。该理论将一个物体的平面看作是一个个极其微小、凹凸不平的表面所构成。越是平滑的面,它的微表面就越是朝着同一个方向;相反表面越是粗糙,它的微表面就越是面对不同的方向,如下图所示:
我们利用一个参数:粗糙度(roughness)来描述平面的的各个微表面朝向的离散程度。根据之前提到的Blinn-Phong模型,我们可知随着平面越朝着h向量(视角向量和光线向量的和),则高光的部分越强,再结合粗糙度,我们可以完整地描述模型的高光反射:
可以看到,在同样的视角下,随着粗糙度降低,则平面越来越平滑,则高光越来越强,且高光的区域越来越聚焦。
反射与折射
在之前的Phong模型中,我们知道除了高光反射,还有漫反射。PBR理论指出,深入研究光打到物体平面上的运行后可以发现,有一部分光会直接从表面反射出去,这其实就是我们前面提到的高光发射。与此相对,有一部分光则会进入物体表面,产生折射,这一部分光有一些会被吸收,产生热能,另外一些则会和在物体内部进一步碰撞、反射,最终以随机的方向再次反射出去。是不是觉得似曾相识?没错,这其实就是漫反射。PBR理论假设这个折射并反射出去的过程发生在一个非常小的范围内(相对应的,有一种理论叫做“次表面散射”,它没有局限于上面的假设,进一步研究了光线折射后的行为,在皮肤、蜡烛等物体上有着更为真实的渲染效果)。下图展示了光线在打到平面上时所发生的反射和折射现象:
不过有一种物体是需要特殊对待的,就是金属。对于金属来说,它只有高光反射而没有漫反射。
另外需要注意的一点是,PBR模型实际上省略了由于碰撞转化为热能的那一部分光的能量,那么根据能量守恒定律,就可以得知入射能量和出射能量是相等的,并且出射光反射部分的能量和折射部分的能量是互斥的。
因此,对于出射光,我们设kd为漫反射比例,ks为高光反射比例,那么必然可得:
kd + ks = 1.0