原文连接:http://www.marmoset.co/toolbag/learn/pbr-theoryhtml
近来,基于物理的渲染(PBR)是一项使人激动的实时渲染的趋势。这个术语包含了不少内容,一般会让人产生困惑,以致于不明白它究竟是什么。所以我将使用试图解释下,什么是基于物理的渲染,以及它和以往的渲染方式的区别。这篇文档主要是给非技术工程师的,而且文中不会有任何数学和代码。git
基于物理的渲染系统不一样于以往的渲染系统,大部分更细节的缘由是关于光和表面的行为。着色能力有了很大的进步,一些老旧的近似模拟的效果和制做方法能够抛弃了。这就意味着技术工程师和艺术家都应该清楚的理解这些变化。github
在讲解基于物理的渲染的新内容以前,咱们会从一些基础的内容开始讲起。若是你已经知道下面要讲的内容了,你应该会认为这是很是值得阅读的。或许你能够去看看 Joe Wilson 的名为 creating PBR artwork 的文章。ide
散射(Diffusion)和反射(Reflection),就是咱们平时所说的漫反射(diffuse)和镜面反射(specular),这是描述光和表面交互的最基本的区别的两个术语。大多数人在现实状况中对这些概念很熟悉,可是也许并不知道其中的物理区别。wordpress
当光线到达表面边界时,一部分会被反射(反弹)出去,方向是在法线的另外一边的相反的方向。这个行为很是相似于朝着地面或者墙扔出一个球,球会以一个相反的角度反射出去。在一个平滑的表面上,就会表现为像一个镜面同样。镜面反射(specular)这个词一般用来描述这个效果。post
然而并非全部的光线都会被反射出去。一般一部分光线会穿到被照亮的表面的内部去。这部分光线可能被材质所吸取,或者在内部散射开。一部分散射开的光线会再次回到表面,射入眼睛或相机。这个过程有不少个名字:漫反射(Diffuse Light)、散射(Diffusion)、子表面散射(Subsurface Scattering),全部这些名词说的是同一个事情。ui
吸取和散射光线对于不一样波长的光线是有很大区别的,取决因而什么让物体着色(好比一个物体吸取了大部分颜色,可是散射蓝色,那物体就表现为蓝色)。散射一般都是很均匀且杂乱的,能够说是从全部方向上都是同样的,这和镜面有很大的不一样。Shader 使用一个名为 Albedo 的输入来近似模拟,Albedo 是一个颜色值,它描述了光线的各类颜色散射出表面的百分比。有时候也用 Diffuse color 这个词来表示,它和 Albedo 是一个意思。spa
在一些状况下,反射会变得更为复杂,好比像皮肤、蜡这一类的材质,在材质内部光线有着很大散射距离。这时单一的颜色就没法表现了,着色系统必须考虑到物体的形状和厚度。若是物体足够的薄,一般会看到光线从背面散射出来,这被称为半透明。若是几乎没有散射(好比玻璃),全部的光线彻底穿过了物体,这就是透明。这些行为和普通的近表面反射有着很大的不一样,须要特殊的着色器来模拟。excel
经过以上这些描述,咱们有足够的信息得出如下的结论,散射和反射是相互独立的。由于,为了让光线被散射,光线必须先进入表面,这就意味着没有了反射。这就是“能量守恒”这个说法的一个例子,也就是说离开表面的光线不会比落在表面的光线更亮。htm
这点很是容易在着色系统是实现:在漫反射着色以前,简单的减去被反射的光线。这就意味着高反射率的物体看上去没有了散射光,由于没有光线进入物体表面,几乎都被反射掉了。反过来也是正确的:一个有着更多散射的材质,就没法有不少的反射。
这种能量守恒是基于物理渲染的重要的部分。这可让艺术家在符合物理定律的基础上调整散射和折射值。然而一个好的艺术效果并非必须在代码中强制加上这些限制,只是做为一个参考物理概念(nanny physicist),以确保不会偏离规则太远或者在不一样的光照条件下变得不一致。
导电的材质,尤为是金属,由于一些缘由值得特别的说起一下。
首先,导体一般比绝缘体有更多的反射。导体一般表现出高达 60% ~ 90% 的反射率,而绝缘体比较低,在 0% ~ 20% 之间。这种高反射率阻止了大多数光线进入物体内部进行散射,让金属看起来很是的亮。
第二,导体的反射在可见光的光谱上回呈现出很大的差别,也就是说反射会呈现出色彩。这种色彩反射在导体中也是很少见的,可是它就发生在咱们平常会接触到的材质上,好比黄金,铜,黄铜。绝缘体一般不会有这个现象,它们的反射不会呈现出色彩。
最后,导体一般会吸取而不是散射进入内部的光线。也就是说在导体理论中不会有任何的散射光线。现实中,每每有一些氧化物或者残留物在金属的表面,这些东西会散射少许的光线。
正是这种介于金属和其余物质之间的材质致使一些渲染系统采用“金属度”做为一个直接的输入参数。在这种系统下,艺术家能够指定材质表现为金属的程度,而不是仅仅明确的指定反射率和散射率。有时会更倾向于使用更简单含义来建立材质,但这并非基于物理渲染的必须的特征。
Augustin-Jean Fresnel 彷佛是一个咱们没法忘记的已经去世的白人,主要是用他的名字表述了一系列的现象,他是第一个对这类现象作到精确描述的人。在他以前,很难去讨论光的反射。
在计算机图形学中,Fresnel 是指出如今不一样角度上的不一样的反射率。明确的说,比起光线正中表面,当光线以一个擦着物体表面的角度(Grazing Angles)射到物体上时更像是一种反射。这就意味着呈现了合适的 Fresnel 效果的物体,在边缘将有更明亮的反射。咱们大多数人其实已经对此很熟悉了,而且这在计算机图形学中也不是新的概念了。然而基于物理的渲染着色器对 Fresnel 方程的评估进行了一些重要的修正。
首先,对于全部的材质,在 Grazing Agnels 有着彻底的反射率,观察一个平滑物体的边缘,应该是一个完美的镜面,无论是什么材质。也确实是这样的,任何一种物质当以一个正确的角度去看时均可以做为一个完美的镜面!这也许有点违反直觉,可是物理上就是这样的。
其次,不一样材质的 Fresnel 属性随着角度变化的曲线并非有很大的差异。金属之间是差异最大的,可是也能够被解释分析。
这对咱们意味着,加入想要增长真实感,艺术家一般应该减少 Fresnel 现象的差别,而不是扩大这种差别。至少,咱们知道了如何设置默认值。
这是一个好消息,由于能够简化内容的生成。着色系统能够彻底本身来处理 Fresnel 效果。只须要使用一些已经存在的材质属性,就像是光泽(Gloss)和反射率(Reflectivity)。
基于物理的渲染的工做流有一个艺术家指定的某种“基础反射”值。这个值提供了光线反射的最小数量和颜色。Fresnel 效果,一旦渲染,将会在艺术家指定的反射率上再进行叠加,在斜观察表面角度(Glancing Angles)时会达到100%。这个值是一个基础值,Fresnel 等式会接管这个值,使得表面在许多角度时根据须要产生更多的反射。
对于 Fresnel 效果有一个提示,当表面变得平滑的时候,Fresnel 效果会迅速的变得难以观察到。
上面描述的反射和散射都依赖于表面的朝向。放大来看,这被用来渲染网格的形状,也可使用法线贴图来描述更小的细节。这样任何渲染系统均可以处理更多的细节,把反射和散射表现得更好。
然而,任然有一点没有考虑到。大多数真实世界的表面都存在很是小的缺口:凹槽、裂缝、凸块,这些都由于过小了以致于眼睛没法看到,而且使用正常解析度的法线贴图都没法表现出来。尽管没法被肉眼看到,但这些微粒仍是影响着反射和折射。
为表面细节最容易在反射中被观察到(散射并不会被太多的影响到,这里不会讨论到)。上图中,入射光的平行线当从粗糙的表面反射是发生了交叉,由于每一条射线遇到的表面方向都不同。就像将球抛向墙面同样,若是墙面很是不平整,球任然会反弹,可是反弹方向是不可预测的。简而言之,表面越粗糙,越多的反射光线会产生交叉,看上去越“模糊”。
不幸的是,为了着色而评估每个微表面特征对美术、内存、计算量来讲都是很是昂贵的操做。咱们该怎么作呢?事实证实,若是咱们放弃直接描述微表面,取而代之使用总体的粗糙度,就能够写出至关精确的着色器来产生相似的效果。这个值一般指的是光泽度(Gloss),平滑度(Smoothness)或者粗糙度(Roughness)。能够从纹理或者一个常量值中获取。
这种微表面细节对于任何材质来讲都是很是重要的,由于真实世界处处都是各类各样的微表面特征。光泽贴图并非一个新的盖面,可是它在基于物理的渲染中起到了关键的做用,由于微表面细节对光反射有着很大的影响。就如咱们一下子会看到的,有几个关于微表面属性基于物理渲染改善的注意事项。
就如咱们假想的着色系统,考虑到了微表面细、合适的反射光延展,咱们也必须考虑到反射正确数量的光线。遗憾的是,旧的渲染系统在这一点上都是错误的,根据微表面的粗糙度反射了太多或者太少的光线。
当方程达到一个正确的平衡时,渲染系统应该显示粗糙的表面为大范围的昏暗的高亮。全部的材质都反射相同数量的光线,粗糙的表面将光散射到不一样的方向上,而平滑的表面反射为更集中的光线。
这是能量守恒必须作到的第二个特征。这是任何基于物理的渲染系统必须作到的要点之一。
基于以上的知识,咱们认识到一个事实,微表面的光泽度直接影响到表面反射的亮度。这就意味着艺术家能够直接在光泽度贴图上绘制各类差别,划痕、刮擦等, 基于物理的渲染不只会改变反射方向并且会影响相对强度。再也不须要相似于反射率遮罩图了。
这是很重要的,由于真实世界的两个在物理上相关度量值(微表面细节和反射率)第一次在艺术上和渲染处理上被正确的联系在了一块儿。这与以前描述的反射和散射的平衡很像,咱们可让两个值相互独立,可是因为它们是有联系的,企图分别对待它们只会变得更困难。
经过观察真实世界材质,反射率值不会不会相差太大。好比说水和淤泥,它们的反射率是相似的,可是因为淤泥表面至关的粗糙,而水表面至关的平滑,因此它们在反射率上看上去会相差很大。艺术家建立下面的这个基于物理渲染的场景时主要会建立不一样的粗糙或者平滑的控制纹理,而不是调整反射率参数。
此外微表面属性在反射上还有其余的细微效果。例如边缘变量的 Fresnel 效果在粗糙的表面上会变得不明显(这是由粗糙表面更多的散射形成的)。凹的微表面会“困住”光线,致使光线会在微表面之间屡次反射,屡次进入描边内部,被更多的吸取,更多的散射,亮度变暗。不一样的渲染系统在处理这些细节上会使用不一样的方法,可是粗糙的表面会显得更昏暗上是趋于一致的。
固然还有不少关于基于物理的渲染可说的,这篇文章只是一些基础的介绍。想要了解更多的相关技术,推荐几篇阅读:
goto blog