基于物理的渲染详尽指南 卷1光与介质:基于物理的渲染和着色理论

光与介质 ios

基于物理的渲染和着色理论 程序员

此文对于程序员和美术制做人员都有很大的帮助做用,但愿你看完后对基于物理的渲染有个总体的理解,此篇翻译的文章(The Comprehensive PBR Guide by Allegorithmic - vol. 1)基本上是从美术的角度来解释基于物理的渲染,有时间我会把程序部分的知识再细致讲一下,包括理论和实现,我本身目前也在学习阶段,主要在研究UE4的基于物理的渲染,但愿在接下来的时间里出一个比较详细的文章来从程序员的角度详细阐述实现原理。 算法

                                                                                                By 风恋残雪 api

                                                                                            博客:http://www.cnblogs.com/ghl_carmack/ ide

光是一种复杂的现象,由于它同时具备波和粒子的属性。所以,建立了不一样的模型来描述光的行为。做为制做贴图的美工,咱们关心光-射线模型,由于它描述了光和介质是如何交互的。对于咱们来讲,理解光线如何跟介质表面交互很重要,由于咱们的工做就是要制做描述那个表面的贴图。咱们制做的贴图和材质用来在虚拟世界中跟光线交互,咱们对光如何表面了解得越多,咱们制做的贴图看起来就越好。wordpress

在这个指南里面,咱们会讨论物理背后的理论,它是基于物理渲染的模型的理论基础。让咱们从光线提及而后逐步扩展到基于物理渲染的关键因素。函数

光线(Light Rays)

光线模型代表光线在好比空气等的均匀透明介质中沿直线传播,它也代表射线在遇到不透明物体的表面或者穿过不一样介质(好比空气到水中)时会有一个能够预测的行为。这样,显示光线从一个起点开始到最后转换成另外一种形式的能量 好比热能的路径便成为可能。学习

到达表面的光线叫作入射光线,到达表面跟法线造成的夹角叫入射角,如图01所示。ui

光线在两种介质交界入是入射的。当光线到达表面时,二者之中或者二者所有会发生:编码

  1. 光线反射离开表面,而且以另一个方向传播。它遵循反射定律,反射角等于入射角(反射光线)。
  2. 光线从一种介质进入另外 一种介质直线传播(折射光线)。

此时,咱们能够说光线分为两个方向:反射和折射。在表面,光线被反射或者折射,也能够最终被介质吸取。然而,吸取并不发生在表面。

图01

吸取与散射(透明与半透明)

当光线在非均匀介质或半透明材质中传播时,光线能够被吸取或者散射:

  1. 经过吸取,光的强度因为它转换成另一种形式的能量(经过是热能)而变小,它的颜色也会由于对不一样波长光的吸取不一样而发生改变,可是光线的方向不发生改变。
  2. 经过散射,光线的方向随机发生改变,误差的大小 取决于材质。散射随机改变光的方向可是并不会改变强度。耳朵是一个很好的例子,由于耳朵很薄(吸取少),因此你能够看到散射的光从耳朵背后射出。若是没有散射而吸取又不多,那么光线能够直接穿过诸如玻璃的表面。好比,你在一个池子里面游泳,但愿它是干净的,那么当你打开双眼时,你会在干净的水中看很远的距离。然而,让咱们假设在同一个池子中,可是不很脏,水中的小颗粒会散射光,这样水的能见度就会低不少。

光线在这样的介质或者材质中传播得越远,它被吸取或散射的就越多。所以物体的厚度对光线吸取或散射的程度起一个绝对性的做用。那么一个厚度贴图能够用来描述Shader中物体的厚度,如图02所示

图02

漫反射和高光反射

高光反射是在表面被反射的光,就如咱们在光线部分讨论的。光线经反射离开表面而且沿一个不一样的方向传播。它遵循反射定律,在一个彻底光滑的表面,反射角等于入射角。然而,大多数表面是不规则的而且反射的方向会根据表面的粗糙度来随机改变,知道这一点很重要。它改变了光的方向,可是光的强度并无改变。

粗糙的表面会有一个较大且较暗的高光。光滑的表面会保持高光汇集,这样在特定的角度下它看上去会更亮或者说更强。然而两种状况下都是同等数量的光能被反射,如图3所示。

图03 越粗糙的表面有越大、越暗的高光

漫反射是通过折射的光。光线从一种介质传输到另一种介质而且在物体内部散射了屡次。而后它又被折射离开物体进入原来的介质里面,而且位置跟第一次进入时的位置差很少是同一个点,若是图04所示。

图04

漫反射材质是很能吸取的,这意味着若是折射的光线在材质里面传输过长的 话,它颇有可能被彻底吸取。这意味着光线不会从材质里面出来,它可能并无传输多少的 距离。这就是为何进入和离开表面的点之间的距离能够忽略不计。在传统着色系统中一直用于漫反射计算的Lambertian模型,不会计入表面粗糙度的影响,可是也有考虑粗糙度影响的Oren-Nayar模型。

同时拥有高散射率和低吸取率的材质有时候被称为参与介质(participating media)或者半透明材质。好比烟、牛奶、皮肤、翡翠、大理石。使用额外的次表面散射模型来渲染后三种物体是可能的,该模型会把光线进入和出射的点的距离计算进去。精确渲染如烟和雾此类变化无穷的低散射率和吸取率的介质须要诸如蒙特卡罗模拟等更复杂的算法。

微表面理论

理论上,漫反射和高光反射都依赖于光线相交表面的不规则程度,粗糙度对于漫反射的影响比较小由于散射发生在材质内部。所以出射方向基本上跟表面的粗糙度和入射方向无关。最深用的漫反射模型(Lambertian)彻底忽略它。

在这个文档里,咱们把表面的不规则程度叫作粗糙度。实际上,它也有几个其它的名字,好比粗糙度、光滑程度、光泽度或者微表面,跟使用基于物理渲染工做流程有关,可是它们都是说的表面的同一个方面,它就是子纹素(sub-texel)几何细节。

表面的不规则程序表如今粗糙度或者光泽度贴图中,这取决于你使用的工做流程。一个基材物理的双向反射分布函数(BRDF)是基于微表面理论的,它假设表面是由所谓的不一样方向的微小细节表面组成。每个微小的平面都会根据它的法线方向在一个方向上反射光线,如图05所示。

图05

表面法线朝向光源方向和视线方向中间的微表面会反射可见光。然而,不是全部的表面法线和半角法线(half normal)相等的微表面都会反射光线,由于其中有些被遮挡(光源方向)或者掩蔽如上图05所示。

在微观层面上不规则的表面会形成光的漫反射。例如,模糊的反射是因为光线的散射形成的。反射的光线并不平等,所以咱们收到的高光反射是模糊的,如图06所示。

图06在微观层面上不规则的表面会形成光的漫反射

颜色

表面的颜色(咱们人眼看到的颜色)是因为光源发射出的波长和它被 物体吸取以及反射的漫反射和高光所决定的。剩下的被反射的波长的光就是咱们看到的颜色。

例如,一个苹果的表面大部分反射红色的光线。只有波长为红色的光被散射回表面,其它的均被吸取了。如图07所示。

图07

它也有跟光源颜色相同的高光,由于像苹果这样的绝缘体的表面的材质高光反射几乎是独立于波长的。所以,这种材质的高光反射是基本是都是没有被修改过颜色的(跟光源的颜色相同)咱们会在接下来的章节中讨论不一样材质(金属和非金属)。

双向反射分布函数(BRDF)

双向反射分布函数简单来讲就是一个描述表面反射属性的一个函数。在计算机图形学中,有不少的不一样的BRDF的模型,其中一些并非基于物理的。一个BRDF要知足基于物理的特性,它必须是能量守恒的且相互的。对于相互的,我是指亥姆霍兹倒易律,它代表入射和出射光线能够在不影响BRDF值的状况下相互交换。

Substance使用的基于物理渲染的着色器(shaders)是基于迪斯尼的理论反射模型的(虚幻引擎的也是基于这个理论修改简化而来),它是基于GGX微表面分布。GGX在高光分布上要比其它方案好,它有一个较短的高光峰值和在衰减的部分有一个较长的尾部,这样它看上去就比较真实。如图08所示。

图08

能量守恒

能量守恒在基于物理渲染的解决方案中扮演着关键的角色。它代表被表面从新发射的光的总能量(反射和散射回来的)是小于它接收到的能量的总数的。换句话说就是,通过反射离开表面的光不会比到达表面的光的强度更强。做为美术,咱们没有必要担忧如何控制能量 守恒。这是基于物理渲染的最好的一个方面,能量守恒经过 着色器(shader)来强制保证。它是基于物理模型的一部分,这样咱们就能够花更多的时间在如何制做出好的效果上而不是关注于物理实现上。

菲涅尔效果(Fresnel Effect)

菲涅尔反射因子做为BRDF的一个系数在基于物理渲染中也是一个很是重要的角色。由法国物理学家Augustin-Jean Fresnel发现的菲涅尔效果声明你从一个表面看到的反射光线的数量取决于你接收它时的观察角度。

好比,假设有一池水,若是你垂直于水的表面直接向下看,你能够很清楚的看到底部(假设水比较清澈)。以这种方式来观察水的表面基本上为0度或者说是沿法线入射,法线是指表面的法线。如今,若是你以一个切线入射方向来观察水的表面,尽可能平行于水面,那么你会看到水面上的高光反射变得更强,而且你可能彻底看不到水底的样子。

基于物理渲染的菲涅尔效果并不像咱们在传统着色模型中使用的那样。再次重申一次,它是基于物理渲染的着色器处理的另一个物理特性。当在一个切线入射角观察表面时,全部光滑的表面在入射角为90度时会成为一个百分百的反射器。

对于粗糙表面来讲,反射中高光部分会更多,可是不会达到百分百的高光反射。这个时候起决定做用的是微表面的法线和光线的夹角而不是宏观表面的法线和光线的夹角。所以光线被分散到不一样的方向,反射会变得更柔和、更暗。在一个宏观层次上,你看到的效果可能 是微表面全部 菲涅尔效果的一个平均效果。

F0 (在0度角的时候菲涅尔反射值)

当光源垂直(0度角)到达表面时,其中一部分光做为高光反射回来。使用表面的折射率(IOR),你能够推导出反射回来的数量,这个值就被称为F0(Fresnel 0),如图09所示。被折射进入表面的光源的数量被称为1-F0。

图09对于粗糙表面来讲,反射中高光部分会更多,可是不会达到百分百的高光反射

对于普通的绝缘体来讲,F0的值通常在0.02到0.05之间,而对于导体来讲F0的范围通常在0.5到1.0之间。所以 ,表面的反射能力是由下面的折射率公式决定的,如图10所示,它来自于Sebasien Lagarde's "Feeding a Physically-based Shading Model"这篇博文。

图10

F0的反射值是咱们须要在制做贴图的过程当中须要关注的。非金属(电介质/绝缘体)通常是一个灰度值,而金属(导体)会有一个RGB值。关于基于物理的渲染且从一个美术的角度来解释反射,咱们能够说对于 普通的光滑绝缘体表面,F0会反射2%到5%的光线,而在切线角时会反射百分百的光线,如图09所示。

电介质的反射值 变化的并不剧烈,实际上,改变粗糙度时实际值的变化基本上看不出来。然而 ,值会有所不一样。在图11里面,你能够看到一个展现金属和非金属材质F0范围的一个图表。

注意非金属的F0的范围并不会跟其它非金属有很大的不一样。宝石是一个例外,它们有较高的值 。咱们接下来会讨论F0,由于它跟导体和绝缘体有比较大的关系。

图11

导体和绝缘体(金属和非金属)

当建立基于物理渲染的材质的时候,我发现以金属和非金属来思考如何制做是颇有用的。我会问本身这个表面是金属仍是非金属。若是 是,我会遵循一系列准则,若是不是我会遵循另一些准则。这个方法可能过于简单,由于有此材质并不会简单的归为金属或者非金属,好比准金属,可是在建立材质的整个过程当中,区分金属和非金属是一个好的方法,除了准金属是个例外。为了给制做材质设置一些规则,咱们首先必需要理解咱们要建立什么。经过基于物理渲染,咱们能够查看金属和非金属的属性来建立准则。

折射光线被吸取,金属的颜色来自于反射的光线,所以在咱们的贴图中,金属没有漫反射颜色。

金属

金属(导体)是热和电的良好导体。简单来讲,导体金属的电子场为0而且当一个由电和磁组成的光波到达表面时,其中的一部分被反射而另一部分则被吸取。抛光金属的反射值通常在70-100%一个很高的范围内,如图12所示。

图12

一些金属吸取不一样波长的光线。好比,金子吸取在可见光谱高频区域的蓝色光,所以它看上去会偏黄。然而 ,所以折射的光被吸取了,金属的颜色来自于反射的光线,所以在咱们的贴图中,金属没有漫反射颜色。好比,在高光/光泽度工做流程中,纯金属在漫反射贴图中颜色为黑色,在高光贴图中反射值是一个上色的颜色值。对于金属,反射值 是一个RGB值而且是能够调节色彩的。因为咱们使用的基于物理的模型,咱们须要给咱们的金属反射值使用真实世界测量的值。

另一个关于金属制做贴图的一个须要注意的方面是金属能够腐蚀。这意味着风化在金属的反射状态中扮演着一个重要的角色。好比,若是金属生锈了,那么它就改变了金属的反射状态而且腐蚀的区域须要当作绝缘体材质来自处理,如图13所示。

图13

喷漆的金属会当作非金属而不是金属来对待。喷漆视为纯金属上的一个层。只有从掉落的漆裸露出来的纯金属才当作金属来对待。一样也适用于金属上的尘土或者任何挡住纯金属的介质。

如我上面所述,我常常问本身一个材质是金属仍是不是。然而,更加精确地说,问题应该是获取金属的状态,好比它是不喷漆,生锈或者被尘土或者油脂遮挡。若是不是纯金属那么它就会被当作电介质来处理,也有可能由于风化形成纯金属和非金属的融合。

风化在决定金属的反射状态扮演一个重要的角色。

非金属

非金属(绝缘体/电介质)是电子的不良导体。折射光线被散射和吸取(一般会从表面从新发射)所以比起金属来它们反射不多一部分的光线,这样就获得一个漫反射颜色。咱们前面说过,普通绝缘体的经过折射率计算的F0值在2-5%之间。这些值在线性空间中的范围为0.017-0.067之间(40-75 sRGB)如图14所示。宝石是个例外,大多数的非金属不会大于4%。

图14

就跟金属同样,它们也须要真实世界测量的值,可是不透明材质的折射率很难找到。然而,大多数 常见的电介质的F0值不会变化很大,所以咱们能够遵循一些指南来找出反射的值,咱们会在卷2中介绍。

常见电介质的F0反射值在2-5%之间,经过折射率计算而来(IOR)。

线性空间渲染

线性空间若是展开来说就能够写一整篇文章。所以,咱们不会深刻细节。然而,咱们须要知道光照计算必须在线性空间完成。

简单来讲,线性空间渲染为光照计算提供了正确的数学方式。它为光照表现得跟真实世界同样创造了一种环境。在线性鹤立是内,gamma值 为1.0。然而,为了让咱们人眼看起来正确,这些贴图须要使用sRGB编码。在Substance中,若是 图片标记了sRGB,那么它会被转换到线性空间为了之后的计算,最后会转换成sRGB编码来显示到屏幕上。然而,当你在纹理里面存储仅表明粗糙度或者金属度的数值时,这些图片须要在线性空间。

Substance自动处理线性和sRGB空间转换做为转入,也会对渲染视口中计算的结果进行gamma校订。做为美术人员,你不须要关心Substance中的线性空间的计算和转换。当经过Substance集成插件来使用Substance材质的时候,线性空间的转换会自动处理。

然而 ,理解过程很重要,由于当Substance贴图用来做为导出位图而且不是使用Substance材质时,你或许根据你使用的渲染器须要手动处理转换。你须要知道基础颜色/漫反射颜色是在sRGB空间,而其它的是在线性空间的。

关键点:

如今咱们已经浏览了基本物理渲染背后的基础理论,咱们能够获得基础物理渲染的一些关键点。

  1. 能量守恒。一个反射光线是不可能比它达到物体表面时更亮的。能量守恒是由着色器(shader)来保证的。
  2. 菲涅尔。双向反射分布函数由着色器来处理。F0反射值对于常见的电介质都差很少,范围在2-5%之间。金属的F0值范围比较大为70-100%之间。
  3. 高光强度经过双向反射分布函数来(BRDF),粗糙度或者光泽度贴图以及F0反射值控制。
  4. 光照计算是在线性空间进行的。全部gamma编码过的贴图,好比基础色或者漫反射一般是经过着色器来转换到线性空间的,可是你可能须要在你的游戏引擎或者渲染器里面经过选择相应的选项来确保正常转换。描述表面属性的贴图如粗糙度,光泽度,金属度或者高度图应该被设置为解释成线性空间的。

参考:

1. Physically-Based Shading at Disney Brent Burley, Walt Disney Animation Studios.
https://disney-animation.s3.amazonaws.com/library/s2012_pbs_disney_brdf_notes_v2.pdf
2. Microfacet Models for Refraction through Rough Surfaces
http://www.cs.cornell.edu/~srm/publications/EGSR07-btdf.pdf
3. Feeding a Physically-Based Shading Model by Sebastien Lagarde
http://seblagarde.wordpress.com/2011/08/17/feeding-a-physical-based-lighting-mode/
4. An Introduction to BRDF Models by Daniël Jimenez Kwast
http://hmi.ewi.utwente.nl/verslagen/capita-selecta/CS-Jimenez-Kwast-Daniel.pdf

整个文件也能够下载pdf: http://files.cnblogs.com/files/ghl_carmack/%E5%9F%BA%E4%BA%8E%E7%89%A9%E7%90%86%E7%9A%84%E6%B8%B2%E6%9F%93%E7%90%86%E8%AE%BA.pdf

相关文章
相关标签/搜索