PBR的基本理论

发表于2017-04-09
评论2 8.2k浏览
  PBR工作流更容易标准化,还可以帮助美术设计人员设计出更好的作品,下面要给大家带来了一篇PBR的文章,对,又是PBR,这篇文章是群内好友倪可冠翻译提供的,么么哒。现在倪可冠和我们一样是一名在职的美术人员,先前他的专业是学光信号传输,感觉很高级哈哈,可冠写了一个自己的简介:

  我叫倪可冠,是一只非专业出身的普通美术狗。因为最近在看PBR的东西,所以顺带着就帮群主翻了这么一篇基础文章,如有不当的翻译欢迎指正,好了就酱紫(自我介绍这个玩意真的很难写,写个简历我会,但是自我介绍。。。)。下文有的括弧里是作者的附注,有的是我的,分别标注挺麻烦的(我就是懒),但绝对不影响理解(也许……吧?)。



PBR的基本理论

  作者 Jeff Russell

  PBR的应用诸如游戏等实时渲染系统当中是一个非常赞的趋势。但同时PBR引起了很多争论困惑PBR的意思如果要用较少的来讲那就是很多意思,如果要用更少的字来讲就是看情况




  这种敷衍的解释显然不能让人满意,所以我揽了这个事去尝试着用一些比较长的段落阐释PBR具体是什么意思,以及PBR上一代的渲染理论有什么不同。本文的适用人群为非工程师群体(艺术工作者为主)所以文内不会出现任何数学公式及程序代码。

  基于物理着色系统与他的上一代的区别主要在光和照射表面进行更细节的运算目前的着色系统已经有了充足的发展,足以上一代的着色系统连同艺术创作中的老手段一同抛弃了。所以工程师和艺术家都应该去了解推动这个变革背后的东西

  在开始之前,我们必须了解一些已经被明确定义的基本知识当你忍受着枯燥看完这篇貌似大学课本的科普文章后,你会发现它真的值得一读。那个时候估计你也会想要瞅一瞅Joe Wilson写的《Physically Based Rendering, 你肯定也行!》(强哥我们等你!) 。



扩散Diffusion反射Reflection

  扩散与反射,也即是漫反射diffuse与镜面反射specular,是描述光与物质的相互作用经常用到的两个词。大多数人应该能基本了解他们的含义,但不一定能知道他们两个在物理上的区别。

  当光线照射到物体表面上时,光线会和入射角度相同的反射角度从物体表面反弹出去(入射角度与反射角度都是光照方向与光照表面发现方向所成的夹角)。你朝墙上扔小球非常相似,你把一个球扔在地上或者墙壁上,小球会以相同的角度但是相反的方向弹开。如果一个表面足够光,那么它将表现的像个镜子一样。镜面反射这个词便用来描述这个现象

  (然后作者说了点关于SpecularMirror两个词的小幽默没什么意思不列出也不翻了

  当然了,并不是所有的光都被表面反射出来了。通常情况下会有一部分光线进入到受照射物体的内部。在受照射物体内,这部分光线会被物体本身吸收(通常会转化为热)或者在物体内进行散射,部分散射的光有可能会通过内部的传播最终又反射回表面,再次成为可以观察到的光线。这个现象有很多叫法,Diffuse Light(漫反射光),Diffusion(扩散光),Subsurface Scattering(子面散射、次表面散射),都说的是一个东西。



  散射(Scattering)的光和被吸收(Absorption)的光的波长往往是不一样的。当受照射物体吸收了大部分的光,但是反射了蓝色的光,那么这个物体看上去就是蓝色的。散射往往是一致无序的,可以说它从各个方向上来看都是一样的,这和镜子完全不同。

  所以当使用PBR的材质球需要描述物体的扩散与反射属性时,只需要输入“固有色albedo”就好了,即用反射贴图来描述从物体表面散射出的各种颜色。Diffuse color有时也被用作的同义词。



半透明与透明

  在某些情况下扩散现象(Diffusion)会更加复杂,比如皮肤和蜡烛这些有着更广泛的扩散距离的材料。这时仅仅一张固有色贴图Albedo是不够的,整个着色系统必须考虑到被照射物体的形状与厚度。如果被照射物体足够的薄,那么往往能够从物体背面看到散射出来的光,并被称为半透明。如果被照射物体内的扩散程度很低(比如玻璃),那么光的散射几乎是不可见的,你可以从物体的这一面看到另一面的整个画面。这一现象和典型的“接近物体受照射表面”的扩散现象有非常大的区别,这时候就需要去专门的调整并去模拟这种物理属性。



能量守恒

  讲到这里我们足以得出一个重要的结论,那就是扩散与反射是完全独立的。这是因为光在扩散之前必须先进入物体内部(也就是没有被物体表面反射)。这在光的投射现象里被称为“能量守恒”,这也就意味着离开表面的光的亮度是不可能高于最初所照射光线的亮度的。

  这个在整个系统里很容易实施:在允许扩散光着色之前仅仅减弱反射的光(上面这句话怎么翻怎么怪,忽略这句吧,并不影响理解其他文字)。这意味着具有高反射属相的物体的散射光几乎可以忽略不计,这单纯是因为大多数的光都反射了,没有光能穿透被照射物体的表面。反过来也是一样的,如果一个物体的扩散光特别明显,那它肯定没什么反射。


固有色不变的情况下,增加反射率的效果

 

  能量守恒定律对基于物理的着色系统是非常重要的一方面。它让艺术家能够控制材质的反射率reflectivity与反照率 albedo,而不会不小心违背了物理法则(这看上去非常糟糕)。虽然为了做出好看的艺术作品,在代码中执行这些约束并不是必须的,但不得不说作为“保姆物理学家”,它在防止艺术作品过于扭曲物理规则以及让材质在不同照明条件下显得不一样上面确实起到了作用。



金属

  基于以下几个原因,导体,特别是金属,需要被重点叨叨几句。

   首先,导体相对于绝缘体具有更强的反射。导体的反射率在60%~90%之间,而绝缘体则低得多,只有0%~20%。这些金属的高反射率意味着大多数的照射光线都不能进入物体内部进行散射,这就意味着金属看上去非常的闪。

   其次,导体的反射光在可见光谱上会发生变化,也就是说反射光被上色了。这种反射的颜色虽然就算在导体中也算很罕见,但这种材料在日常生活中也是能看到(比如黄金,红铜和黄铜)。一般来说,绝缘体并不会出现这种现象,他们的反射是没有色彩影响的。

  最后,导体通常是吸收光,而不是让光散射。这意味着理论上来讲,导体不会表现出任何散射现象。然而在现实中,金属表面上的氧化物和残留物会显现一些少量的散射光。

   正式因为金属与其他物质的二元性,使得一些渲染系统采用直接输入“金属度metalness”的方法来控制一个材料是否是金属。而不是仅仅去分别指定固有色albedo和反射率reflectivity。有时在创建材质,这会是首选的简单方法,但PBR并不是都要这么做。



菲涅尔

  Augustin-Jean Fresnel在那些死掉的白人老头里算是一个比较不会被忘记的名字。主要是因为他的……(这段真没意思不翻了,有兴趣的自己去百度百科搜Augustin-Jean Fresnel

   在计算机绘图中,菲涅尔指的是在不同入射角度时所出现的不同的反射率。具体的说,光的入射角度越大,反射率越高(如果水质够清晰,当你垂直的看水面时,是看不到自己的脸的,只能看到水底。而当你的目光和水面接近水平时,就看不到水底,反而可以看到湖面对岸上的树之类的倒影)。这意味着开了菲涅尔的物体,渲染出来的物体的边缘会有明亮的反射。大多数人都应该很熟悉这个概念,它在计算机绘图中不是个新词。但是PBR在菲涅尔方程上做了一些很重要的修正。

   首先,对所有的材质来说,当以接近水平的角度来观察光滑物体的边缘时,会出现近乎完美的镜面。是的,真的,任何物体都可以作为镜子,只要它是光滑的,并且以正确的角度观察。直觉上会觉得这不科学,但是这很科学。

  第二点,对于不同材质来说,入射角度对应的曲率或者是梯度并没有明显的区别。金属是最特别的,但也没特别到哪里去。(说实话这段翻译我没太明白,看下面的图可以发现不同材质在0°入射角时的反射率差别最大,而在90°时都无限接近了100%,所以差别还是蛮大的。不过反射率在靠近0°时爬升的很慢,这时确实是没什么太大变化。再提一句,不知道别人是不是这样,不过之前我在vray里做金属材质时候确实是不太开菲涅尔,并不是说金属没有菲涅尔效应,而是金属本身反射就很强,这使得球状金属的边缘反射没有像平滑的橡胶那么明显而已。开了菲涅尔反而会让金属的边缘过亮,有时候会看起来很奇怪。

  这对我们来说,在理想情况下,艺术家对菲涅尔的控制应该越少越好。或者最起码的,我们现在知道在哪里去设置默认值。

   因为生成内容更简化了,所以这是个好消息。着色系统现在几乎可以自己处理菲涅尔效应,它只需要确认材质的一些其他前置参数,比如光泽度gloss和反射率reflectivity




  PBR工作流中会让艺术家描述一个基础反射率来设置反射值和反射光的颜色。一旦开始渲染,菲涅尔效应将会使得以接近水平角度照射到物品边缘的光纤的反射率增加到将近100%(白色)。也即是说,根据需要,菲涅尔会使得受照射物体表面对应的不同角度具有更多的反射。

   最后要注意的是,一旦受照射物体的表面变得不光滑,那么菲涅尔效应将很难被观察到此种情况下的更多说明会在之后给出(其实就是因为微表面的缘故)



 微表面

  上面所说反射与扩散都是由表面的方向所决定的在较大的尺度下可以理解为宏观条件下)这是由被渲染表面的形状决定,当然也可以使用normal map来描述一些细节。只要有了这些信息任何渲染系统都能将扩散和反射表现的相当不错。

  然而我们仍然忽略了一个地方。现实当中大多数物体的表面都会有非常微小缺陷:微小的凹槽,裂缝,几乎肉眼不可见的凸起,以及在正常情况下过于细小以至于难以使用normal map去表现的细节。尽管这些微观的细节几乎是肉眼观察不到的,但是他们仍然影响着光的扩散和反射。



(插图5模糊反射)


  微表处的细节对反射的影响最容易被观察(次表面的散射不太会被影响到,所以这里就不说了)。在上图中,当平行光照射到粗糙表面时会分散开来,也即是每条光线都照射到了物体表面上朝向不同的部分。用小球和墙壁来说:球仍然会反弹但反弹的角度变得不可预知。总之,物体表面越粗糙,反射光看上去越“模糊”。

  不幸的是,分别去计算每一个微小表面所对应的光照情况不可能的。那怎么办?如果我们放弃去直接计算每个微表面的光照和反射情况,而是直接给一个粗糙度数值,那我们可以写出一个相当准确的shader并得到非常相似的最终效果。这个数值通常被称为“光泽度”,“平滑度”,或“粗糙度”。它可以被特定的制作为一张贴图并赋予给材质

  微表面的细节对于任何材质都是个非常重要的特质,就像真实世界中就有着各种各样的微表面。光泽度贴图并不是一个新概念,但因为微表面的细节对光照的反射具有如此重要的影响,所以它在PBR占据了一个关键位置。很快我们就将看到PBR着色系统在微表面方面的改进。



 能量守恒

   现在我们的着色系统已经能够微表面的细节考虑进去,将反射光适当的扩散,它也必须要去非常小心的反射亮度正确的光。很遗憾的是许多上一代的渲染引擎把这个搞错了,虽然仍旧取决于微表面的粗燥程度,但它们要么反射了过量的光要么反射了过少的光。

  当方程被正确的平衡,渲染器将展示出这样的效果:粗糙表面的的反射高光显得比较大但是比较暗,光滑表面的高光会比较小较为清晰而且更亮。同等亮度下的差异:两个材质都反射同样亮度的光,粗糙表面反射的光会扩散到不同方向,而光滑表面反射的光则集中成光束



插图反射率不变的情况下,逐渐增加光滑度的效果


  (你看,第一个球因为粗糙所以菲涅尔不明显,第五个球虽然光滑,但是它固有的反射率就很高所以菲涅尔还是不明显。简直蛋疼。所以PBR能自己处理菲涅尔简直万岁万岁万万岁!

  除了之前提到的散射与反射能量守恒之外,这里我们会需要遵循第二种形式的能量守恒任何基于物理的渲染引擎都要记住这个。



微表面万岁

  根据以上知识,我们知道:微表面的光泽程度对反射亮度有着直接的影响。这意味着艺术家可以直接在光泽度图上绘制划痕、凹痕、磨损或抛光区等等PBR系统将同时显现反射范围和反射强度的变化。不再需要绘制反射mask

   这很重要,因为他们之间的相关性,现在在一开始,就可以将微表面的细节和反射率放在一起来进行绘制。非常像之前说的扩散Diffusion反射Reflection之间的平衡:我们当然可以分别来绘制他们的数值,但因为他们的相关性,分别处理他们非常困难

  此外,对现实世界中的材料的调查告诉我们,物质的反射率不会有很大的变化(前面说导体的部分)这里有个很好的例子:水和泥。水和泥的反射率虽然接近但由于泥非常粗糙水坑的表面非常光滑他们的呈现反射非常不一样一个艺术家通过PBR系统创造了下面这样的场景,其中首要的差异便是通过光滑度或者粗糙度贴图表现的而不是去调整他们的反射率,如下图所示:



  微表面在反射上还有其他的特质。比如菲涅尔的亮边效果在粗糙表面上减弱(粗糙表面的菲涅尔效应被“分散”这样观察者就不能轻易地注意到它。)此外微表面上较大的凹陷会“困住”光,并导致光在表面上进行多次反射,同时也增加了光线吸收的次数降低了它的亮度。不同的渲染器处理这些细节的方式程度不尽相同,较为粗糙的表面看上去暗淡的趋势是一样的。



结论

  关于PBR肯定不止这些要说,这里只就理论方面做了简单的说明。如果你还没有读过Joe Wilson写的《Physically Based Rendering, 你肯定也行!》(强哥我们等你!)那我推荐下面这些文章以供阅读:

John Hable的优秀博客文章:一切都闪亮亮 

http://filmicgames.com/archives/547

John Hable的更优秀的博客文章:一切都有菲涅尔

http://filmicgames.com/archives/557

Sébastien Lagarde摘要:《记得我》的渲染

https://www.fxguide.com/featured/game-environments-parta-remember-me-rendering/

想想Sébastien Lagard所有的博文都值得一读

http://seblagarde.wordpress.com/

2010SIGGRAPH关于PBR的课程

http://renderwonk.com/publications/s2010-shading-course/

永远值得一提的:线性的重要性

http://http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html

如果有任何很捉急问题你可以在我的推特上找

https://twitter.com/j3ffdr


转载自公众号:sculpt_up

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引