基于物理渲染的基本原理

Unity3D在5.0引入了PBS(Physically-Based Shading)特性,这一光照模型取代了Lambert和Phong氏光照模型,带来更逼真的视觉体验,可以在这个demo查看效果。那么什么是Physically-Based Shading呢,Jeff Russell有一篇文章,我个人觉得写得非常好,在此翻译一下,帮助自己理解和消化,同时方便更多对这个技术感兴趣的朋友。

本文翻译自Jeff Russell的《Basic Theory of Physically-Based Rendering》,原文链接地址:https://www.marmoset.co/toolbag/learn/pbr-theory

基于物理渲染(PBR, Physically-based rendering)是最近实时渲染领域一个令人兴奋的趋势。这个术语大家谈论了很多,但经常会让人困惑它究竟是什么意思。简单的回答可能是:“包含内容很多”,或者“得看情况”,这些答案都不尽如人意。所以我自己尝试去解释一下PBR到底是什么、它和老的渲染方式有什么区别。这篇文章并非专门为工程师而写,不会含有任何算法或者代码。

Physically-based shading系统和之前光照系统(主要指Phong氏模型、Lambert模型等)的主要区别是,它对光和表面产生行为有更具体的描述。其着色的能力足够强大,一些老的为了达到近似效果的手段现在可以安全的舍弃,相应额外增加的美术资源也不再需要。这意味着工程师和设计师都应该了解这项技术带来的改变。

在介绍新东西之前,我们将先确定一些基础概念。这些基础概念你可能已经了解,但很值得再次读一读。之后,你可能
也想看看我们自己的Joe Wilson写的文章:创建PBR资源(creating PBR artwork)

漫反射(Diffusion)和反射(Reflection)

漫反射和反射是描述光与表面作用的两个基本术语,很多人可能在经验层面熟悉这两个概念,但并不知道他们在物理上的区别。
当一束光投射到表面上时,其中一些会发生反射——即在表面法线另一侧射出的光线。这个行为跟球从地面或者墙壁上弹回来很像。在一个光滑的表面,这使得表面看起来像镜子。“镜面(specular)”一词经常用来描述这个效果("specular"来源于拉丁文"mirror",即镜子的意思)。
然而,并不是所有的光都从表面反射出去,有些光会渗透到被照明物体的里面。其中有些光被物体材质吸收(通常转化成热量),有些则在内部被散射。这些被散射的光有一部分最后从表面再射出来,从而被眼球或者摄像机看见。我们知道有很多名次来形容这个现象:“漫射光”,“漫反射”,“表面散射”——都是一个意思。

pbr_theory_refl_diff.png

对于不同波长的光,不同物体的漫反射和散射行为通常会有很大差异,这就是为什么物体会看起来有不同的颜色(比如,一个物体吸收大部分除了蓝色波长的光,那么它看起来是蓝色的)。散射往往是如此的混乱、均匀,我们可以认为各个方向看上去都一样,这点和镜面完全不同。一个着色器在实现这种近似效果时,只需要一个输入:“albedo”,它用来描述各种颜色的光照射表面并散射出去时的颜色。我们有时候也叫做“漫反射颜色(Diffuse color)”。

半透明(Translucency)和透明(Transparency)
在某些情况下漫反射会更复杂一些——比如,像皮肤和蜡这类材质具有更宽的散射距离。在这种情况下,只给一个简单的漫反射颜色不够,着色系统必须考虑被照明物体的形状还有厚度。如果足够薄,通常能看到光从物体背面散射出来,我们称这类物体时半透明的。如果漫反射更少(比如,玻璃),那么几乎没有明显的散射现象,能完整的从一边透过物体看到另一边,即是透明。这些行为跟典型的“接近表面”漫反射有很大不同,所以一般要模拟这些效果,需要单独的着色器。

能量守恒
通过上面的描述,我们现在有足够的信息得出一个结论:反射和漫反射是互斥的。这是因为,光如果被漫反射,首先得渗透到表面里(即不会被反射)。在着色领域里,这叫做“能量守恒”。意思是离开表面的光线不会比投射到表面上的更亮。

这个很容易在着色系统里实施:漫反射着色时,只要减去反射光即可。这意味着高反光的物体只有较少甚至没有漫反射,因为没有光线渗透进表面,几乎全被反射回去了。反之亦然,如果一个物体有较亮的漫反射光,反射光就会减少。

pbr_theory_conservation.png

这种能量守恒是基于物理着色的一个重要方面。它允许设计师为材质调节反射率、漫反射率值时不必担心因为某些意外违背物理规律(之前这通常会导致物体看上去很糟糕)。同时,代码里产生看上去好的效果时也不必再严格实施这些限制(译者注:指校验设计师给出的反射、漫反射值,防止人为的错误)。它就像一个“保姆物理学家”一样,防止作品偏离规则太远或者在不同光照条件下变得不一致。

金属

导电材料,最值得注意的是金属,这里有几点需要特别注意。
首先,金属相比绝缘体,往往会有更多反射。导体通常表现的反射性高达60%~90%,然而绝缘体一般会小很多,在0~20%。这种高反射率阻止光到达材质内部产生漫反射,使得金属看起来非常有光泽。

其次,导体的反射率有时会因可见光谱变化而不同,这使得他们的反射光会有颜色。这种带颜色的反射即使在导体中也很少见,但确实在一些常见材料上会发生(比如:金、铜,黄铜)。绝缘体通常都没有这种效果,它们的反射不带有颜色。

最后,导电体通常会吸收渗透进表面的光,而非散射。这意味着理论上导体不会有任何漫反射的现象。然而实际上,由于在这些金属表面通常存在氧化物或其他残留物,使得金属也会散射少量的光。

正是由于金属和其他物体的这些双重性,导致一些渲染系统采用“metalness”作为直接输入。在这些系统里,设计师指定材质的金属性,而不是仅仅指定反射率和漫反射率。这有时候作为创建材质的一个简单的方式,而在基于物理渲染下就不需要这样做。

Fresnel(菲涅尔效应)
奥古斯丁·菲涅耳(Augustin-Jean Fresnel)是我们不能忘记的逝去白人中的一位,主要因为他的名字用于代表一些现象,这些现象是他第一次精确描述出来的。如果不是用他的名字,讨论光的反射会变得困难。

在计算机图形学中,“菲涅尔”指不同的角度将产生不同的反射率。特别的,光斜着射入表面比垂直射入表面更容易发生反射。也就是说一个有适当菲涅尔效果的物体靠近边缘的地方会更亮。我们对这个现象比较熟悉,这在计算机图形学也不是新鲜事。然而,PBR着色器在此基础上对菲涅尔计算方程做了一些修正。

第一,对于所有材质,反射率在入射角临界值达到饱和——任何平滑物体边缘看起来都像镜子一样,与材质无关。是的,只要在恰当的角度观看,任何平滑物体都可以像一面镜子!这可能有点违反直觉,但物理上就是这样。

第二,关于Fresnel属性的第二个现象是:不同材质的反射率/角度曲线差异不大。金属差异相对较大,但也可以分析。

这意味着,如果希望达到非常真实的效果,设计师通常应该减少对“菲涅尔”的人为干涉。或者至少,我们现在知道怎么设置相应的默认值!

这的确是一个好消息,因为它能简化内容的生成。只需要获取之前一些已经存在的材质属性,比如光泽和反射率,渲染系统现在完全能自己处理菲涅尔效果。

pbr_theory_fresnel.png

基于物理渲染的工作流,只需设计师给出一个“基础反射率”。它提供最小的反射光照和颜色。对于菲涅尔效果,一旦渲染完成,会在设计师指定值的基础上增加,直到边沿的100%。即,内容描述一个基本值,菲涅尔公式计算剩下的,这样就能产生我们需要的各个角度不同反射光的效果。

微表面

上面描述的反射和漫反射都基于表面的方向。将其放大,
他由被渲染的网格形状提供。我们也可以利用法线贴图来描述更小的细节。有了这些信息,任何渲染系统也能渲染出很好的漫反射、反射效果。

然而,还有很重要的一块没考虑到。大多实际的表面有非常小的瑕疵:细小的凹槽,裂纹,眼睛不可见的小块,还有连法线贴图都无法表示的细节(法线贴图必须控制在一个合理的分辨率)。虽然肉眼看不见,但这些为特征仍然影响着光的漫射和反射。

pbr_theory_microsurf.png

微表面的细节在反射上有最显著的效果(表面的漫射影响不大,这里将不再讨论)。在上面的图中,你可以看见入射的平行光在粗糙表面反射后分叉,因为不同射线投射到了不同方向的表面。就好比把球扔向一面悬崖或者类似的不平的地方:球还是会反弹,但在一个不可预知的角度。简而言之,表面越粗糙,更多的反射光将会发散或出现“模糊”。

不幸的是,由于资源制作效率、内存占用、计算量的原因,着色时计算每个微表面是不可行的。怎么办呢?如果我们放弃直接描述微表面细节,转而指定一个粗糙程度的一般度量,我们能准确地写出类似结果的着色器。这个度量我们通常叫做“光泽度”、“光滑度”,或“粗糙度”。它可以在材质中用一个贴图或一个常量来指定。

由于真实世界充满了大量微表面特征,微表面细节是任何材质一个非常重要的特性。光泽贴图不是一个新概念,但由于微表面对光反射有如此重大的影响,它在基于物理渲染中担任了一个重要的角色。就像我们马上将要看到的,PBR着色器系统对微表面属性的几个方面做出的改善。

能量守恒(再次提及)

我们假设的着色系统现在考虑了微表面,并且适当的传播了光反射,它还必须考虑到反射光的多少。遗憾的是,很多老的渲染系统在这上面犯了点错,根据微表面的粗糙度,多算或少算了反射光。

当公式经过适当调整后,渲染器应该在显示粗糙表面时具有更大范围的反光,但其亮度相对较暗。而光滑的表面反光范围小,亮度更强、更清晰。明显亮度是关键:两个材质都反射相同数量的光,但粗糙的表面将其散射到了不同的方向,然而平滑的表面反射出一个集中的光线(这里原文是:whereas the smoother surface is reflecting a more concentrated “beam”):

pbr_theory_micro_cons.png

这里我们得出能量守恒必须维持的第二种形式,加上之前描述过的漫反射/反射平衡。把这些做对,是任何想做好“基于物理”渲染器的重点之一。

All Hail Microsurface
有了上面的只是,我们意识到一个重要的事实:微表面光泽直接影响到反射的亮度。这意味着设计师可以直接将变化画到光泽贴图里,如划痕,凹陷,刮擦或抛光区域等任何效果,一个PBR系统会自动显示反射形状和相对强度的变化。不再需要特殊的蒙板贴图、修改反射率!

这是非常有意义的,在物理上相关的两个真实世界量——微表面细节和反射率,现在被正确绑定在一个美术内容中作为第一次渲染处理。这和之前描述的漫反射/反射平衡行为很像:我们可以单独编写两个值,但因为它们是相关的,尝试单独处理它们就变得比较困难。

另外,在对真实世界材质的调查中表明,反射率变化不会太大(见上一章节中关于导体的讨论)。水合泥巴是一个很好的例子:它们都有非常相似的反射率,但因为泥巴非常粗糙、水坑缺非常平滑,其反射效果很不一致。设计师在创建PBR系统的场景时,主要通过设置光泽度或粗糙度贴图来达到区别,而不是调整反射率,如下图所示:

pbr_theory_watermud.png

微表面属性还有一个反射上微妙的效果。举个例子,粗糙表面会减弱“使得边缘更亮”的菲涅尔效果(粗糙表面会散射菲涅尔效应,从而让人很难清晰的观察到)。其次,一些大的或凹陷的微表面能把光“陷”在里面——使得光在里面反射多次,从而更多的光被吸收、亮度下降。不同的渲染系统以不同的方式、不同的程度来处理这些细节,结果确实一致的:越粗糙的表面显得越暗。

结论

关于基于物理的渲染还有很多话题,这篇文章仅提供一个基础的介绍。如果你还没有准备好请阅读乔威尔逊的创建PBR艺术品教程(creating PBR artwork).对于想要更多技术信息的朋友,我推荐几个阅读:

If there are any burning questions still left unanswered, I can usually be reached on twitter.

参考资料:
[1]http://blogs.unity3d.com/cn/2015/02/18/working-with-physically-based-shading-a-practical-approach/

推荐阅读更多精彩内容