查看原文
其他

着色中的数学和物理原理 Naty Hoffman

2016-10-27 翻译:王成林 Gad-腾讯游戏开发者平台


大家好!在接下来的15分钟我将从着色中蕴含的物理原理讲起,然后会介绍用于描述物理原理的数学公式。最后提到的渲染实现将在剩余课程内讲到。




那么从物理学角度来讲,到底什么是光?理论上讲,它是横向的电磁波,意味着当能量向前传播时,它的电磁场向两边摆动。该摆动在电磁场内可以视为两个耦合场:电场与磁场,彼此相对垂直。




电磁波可以由频率(单位时间内摆动次数)或者波长(两波峰间的距离)区分。




工程师们处理的电磁波,波长范围从不到一纳米的百分之一的Gamma波,到频率极低而波长极长的无线电。波长从400纳米(紫外线)到700纳米(红外线)为人眼可见光。




为了感性地认知400到700纳米是什么样子,在左侧你看到的是可见光相对于一根蜘蛛丝的长度,右侧则是同样的一根蜘蛛丝相对于人类头发的长度。




目前我们见到的只是单一波长的正弦波。这是可能的最简单的光波,但它并不是很常见。




大多数的光包含不同能量的波长。左上图是光谱功率分布图(SPD,Spectral Power Distribution)。它显示出此波的能量存在于一条单一波长中,即光谱中的绿色部分。图中为激光发出的单色光。 




上图所示为一束红色,绿色和蓝色激光的SPD。将它们乘以一个因子然后相加,得到了右边的SPD图。这和RGB激光投影设备发出的光相似,目前在剧院中广泛使用。




最终的波形要比单一的正弦波要复杂得多,但也就如此。




自然中的大多数光波拥有广泛的连续的SPD,对应着复杂的波形。该图为D65,一种标准的白色光源。




有趣的是,这两个完全不同的SPD对应同样的颜色(注意y轴的比例不同)。人眼所看到的颜色失真,它将SPD所在的无限维度空间降低为三维空间。




在真空中光波会永远传播。但我们感兴趣的是当光作用于物质时会发生什么。




当电磁波击中一束原子或分子时会将它们极化……




……将分子的正负电荷分开,形成偶极子(dipole)。这个过程吸收波的能量……




……而这个能量会随着分子“复原”的时候被放射出去(有些会以热损耗的形式放出)。在稀薄的空气中,分子间距离很大,可以认为是彼此独立的粒子。其他情况中,则会受到偶极子作用和电磁波干涉,由于数量太多而无法准确地模拟。



物理波光学


想要解决这个难题,光学,严格地讲物理光学或波光学,采用了一定的抽象、简化和近似法进行研究。




均匀介质




其中一项简化内容就是均匀介质概念的提出,光在均匀介质中沿直线传播。虽然这是一个抽象化的概念(因为原子组成的物质不可能是绝对均匀的),实际上对于统一密度和成分的物体来说非常适用。



折射指数




我们通常使用折射指数(IOR,Index of refraction)来描述均匀介质的光学性质,它是一个复数(换句话说,一个两部分的数)。IOR的一部分描述了光在介质中传播的速度,另一部分描述了介质对光的吸收量(非吸收性介质为0)。



散射粒子




介质中一定范围内的非均匀部分被称为粒子;IOR不连贯的地方会将入射光散射到不同的方向。这和上文谈到的单个分子的极化相似,但是这些粒子有可能由很多粒子构成。




散射(云状物)


一个介质的总体外观是由它的吸收性质和散射性质综合决定的。例如,外表为白色(就像上图右下角的牛奶)是高散射率和低吸收率导致的。有颜色的液体会多吸收一些波长的光而少吸收另外波长的光。





我们简单地介绍了一些介质,剩下的演讲将会集中讲解物体的表面。



纳米几何




从光学角度看,一个表面最重要的是它的粗糙度。没有绝对光滑的表面,至少在原子级别你会发现一些不整齐的地方。和波长相近或稍小一点(我们称之为纳米几何级)的不整齐部分会导致衍射现象的发生。



惠更斯-菲涅尔原理




惠更斯原理可以帮助更好地理解衍射现象。它声明平面波上的每一点可以为视为一个球面波的中心,这些球面波彼此发生干扰……



惠更斯-菲涅尔原理




……结果产生平面波。目前为止一切还好。



衍射




但是当光碰到障碍物时……



衍射




……惠更斯原理展示出它如何在角落处略微偏移。在所有的现象中,衍射会导致阴影稍微变得柔软,甚至光源很小的光也会如此。



光学平滑曲面的衍射




图中所示为一光波击中光学平滑曲面(也就是该曲面上所有的不规则部分都在纳米几何尺寸,小于波长),同样的原则也适用。



光学平滑曲面的衍射




表面上的每一个点都发出以其为圆心的球面波。由于面的不规则,有些高点有些低点。



光学平滑曲面的衍射




这些不在一条线上的球面波形成了一个形状复杂的波阵面,它将不同量的光发射到不同的方向。面上不规则的部分越小,被衍射的光越少。入射光碰撞每个原子时会造成一个很小程度(但是可测量的)的衍射。



几何(射线)光学


波光学暂告段落,我们接着讲讲几何光学(或者叫射线光学)。这是一个更简化的模型,在计算机绘图学中占主导地位。我们要做的一个简化就是忽略纳米几何和衍射;我们将光学平滑曲面作为完美的平面。




可以从电磁波方程中得出,这样完美的平面将入射光分为两个方向:反射方向和折射折射方向。



微米几何




很多现实世界的面在光学意义上不平滑,而且包含的不整齐的部分要远大于光的波长,但远小于一像素。这样的微米几何(microgeometry)差异导致面上的每个点以不同的角度反射(或折射)光:外表呈现的是反射和折射的混合结果。



更粗糙=更模糊的反射




这些面看上去同样光滑,但在微米级略有区别。上面的曲面只少量粗糙;曲面上的点角度差别很小,光照射在上面被反射到一个差别不是很大的方向,导致的模糊反射很少。下面的曲面要更粗糙,导致非常模糊的反射。




在宏观上我们可以使用统计法处理微米几何,视表面将光反射(和折射)到多个方向。表面越粗糙,反射和折射形成的圆锥越大。




折射光发生了什么?这与物体的材质有关。



金属(导体)

电介质(绝缘体)

半导体


光是由电磁波组成的。所以物质的光属性与它的电属性紧密相关。光学上物质被分为三大类:金属(导体),电介质(绝缘体),半导体。




金属(导体)

电介质(绝缘体)


由于可见物体的表面很少是半导体材质的,为了实用目的我们可以简化一下分组:金属和非金属类。



金属(导体)




金属会立即吸收折射光。



非金属




非金属和我们之前见到的液体表现相似:折射光会被一定程度散射/吸收。除非物体是由类似玻璃或者水晶这样干净的物质制成,否则有一部分折射光又会被散射回表面上:如图中蓝色箭头所示,它们射向表面不同的方向。




被重新射出的光与它的进入点之间距离差异很大(如上图黄条所示)。该距离的大小与散射粒子的密度和特性有关。




如果像素的大小(或者叫样本着色区)相较于光的出入距离很大(就像红框绿色区域),出于着色的考虑我们可以假设光的出入距离为0。




通过忽略光出入距离,我们可以计算一定点临近的所有着色处理。着好的颜色只受表面那一定点的光照影响。




赋予这两种光-物质作用不同的着色术语会很方便。我们将反射光称为“高光”,将折射、吸收、散射和再折射所产生的光统称为“漫反射光”。




假如像素小于光的出入距离(红框绿色区域),那么我们需要一种特殊的渲染技术“表面下散射”。甚至通常的漫反射着色也是表面下散射的结果:不同在于着色分辨率与散射距离的比较。例如,塑料在一些极度特写镜头(例如小玩具)中会出现一定的漫反射现象。



物理——>数学


目前我们讨论了光作用于物体的物理原理。将这些物理原理转化为着色使用的数学模型,第一步要将光量化为数字。




辐射率


辐射度量学是对光进行测量的学科。在辐射度量学众多物理量中,我们使用辐射率……




辐射率

单射线


……来测量光沿着一条单射线的强度……




辐射率

单射线

光谱/RGB


……辐射率因光谱而异。辐射率被表达为SPD,就像我们上文提到的。在课程的后面部分我会讲到Weta Digital对光谱渲染的使用。但是在今天的演讲中我只会沿着传统的电影和游戏手法,使用RGB代替因光谱而异的辐射率。辐射率的单位是W⋅sr−1⋅m−2。。




假设着色处理可以在临近区域内完成,光在表面上一点的反应只与入射方向与视觉方向有关。



BRDF(Bidirectional Reflectance Distribution Function双向性反射系数分布函数)




我们使用BRDF(Bidirectional Reflectance Distribution Function双向性反射系数分布函数),一个关于入射光方向l和视角方向v的函数来代表这种变化。如图所示,理论上BRDF是一个拥有3或4个角度的函数。在实用中,BRDF函数使用不同数量的角度。注意BRDF只有在入射向量与视角向量都在宏观表面的上方时才有定义;查看课程笔记上有关如何处理其他情况的技巧。



反射方程




这个看上去可怕的方程仅仅是说从一点射出光的辐射率等于入射光辐射率乘以BRDF乘以一个余弦因子,然后在入射方向的半球内做积分。如果你不熟悉积分,你可以把它想象成一种所有入射方向的加权平均数。“圆中有X”的符号借鉴于Real-Time Rendering 这本书:它表示RGB对应分量的乘法。



表面反射(高光)




我们首先来看表面,或者说是高光面。在这张图片中从表面射回的橘色箭头代表着高光。



微平面模型理论




微平面模型理论是一种从非光学平面反射中推演BRDF的方法。该理论成立的依据是假设平面的细节小于观测尺度,但大于光的波长。每一点在其周围都是一面完美的镜子,将每一束入射光反射到一个方向,反射光的方向依赖于入射光的方向I和微平面法线m。



半角向量




只有那些法线m在l和v中间的微平面会反射任何可见光。这个方向被称为半角向量h。



阴影与遮盖




并不是所有m=h的微平面都适用:一些会被其它的微平面挡住光源(形成阴影)或者挡住视角方向(形成遮盖)。



多面跳跃




事实上,被挡住的光会继续弹跳;有的最终会导致BRDF。微平面BRDF忽略这一点,也就是说,被挡住的光就散失掉了。



微平面高光BRDF




这是微平面高光BRDF函数。我将详细讲解不同部分。



菲涅尔反射率




菲涅尔反射率是入射光经由给定物质的光学平面反射而成的反射光部分(而不是折射部分)。它随着入射光方向和平面(在本例中为微平面)法线的改变而变化。菲涅尔反射率反映的是击中相关微平面(那些面对半角方向的平面)的光的反射量大小。



菲涅尔反射率




菲涅尔反射率(此图中的y轴)依赖于折射指数(换句话说,物品的材质组成)以及入射角(图中的x轴)。该图中画出了三线物质(铜和铝)R、G、B三个颜色频道分别的反射率——其它的一线物质只画出了没有颜色的反射率。




对一个光学平面来讲,菲涅尔反射率的相关角度是视角与法线向量的夹角。该图显示的是3D玻璃(上图绿色曲线)壶的菲涅尔反射率。注意中心部分的黑暗如何在边缘变得明亮。



菲涅尔反射率




随着角度的增加,菲涅尔反射率在前45度角中几乎没有变化(图中绿色区域);然后开始变化,首先缓慢(黄色区域,一直到75度角)然后对于掠射角(红色区域)所有波长的光都急剧上升至100%。




这是该3D物体相同颜色区域的形象示意图。可以看出绝大多处可见像素的所在区域反射率几乎没有变化(绿色)或者变化很小(黄色)。




由于可见物体的表面大部分区域菲尼尔反射率为0或几乎为0,我们可以将该值(F0)视为表面特有的高光颜色。




如上所述,将物体分类为金属,绝缘体和半导体非常有用。金属有明亮的高光,除了一个例外(金子的蓝色频道),这张表中的线性数值没有低于0.5的且多数要远高于0.5。除了线性数值,我们还列出了各材质独有的8比特sRGB值。因为金属不存在表面下散射,所以它们的颜色是表面反射决定的。




某些金属颜色很重,尤其是金子;除了蓝色频道数值极低,它的红色频道数值大于1(超出sRGB范围)。实际上金子颜色的厚重决定了它在文化和经济上独一无二的重要性。尽管蓝色数值低,金子是最亮的金属之一——这张表是以高光亮度(CIE Y坐标)进行排序的。



绝缘体的F0­值 




另一方面,绝缘体拥有非彩色的黑暗高光色,所以这张表只给出了一个值而不是RGB三个值。如图所示,它们除了高光色还有漫反射色。所以和金属不同,高光色并不是决定表面颜色的唯一来源。



绝缘体的F0­值 




在这我将常见的绝缘体按照递增的F0­值分组,从2%的水到常见的塑料和玻璃,到一些装饰品,最后是钻石和类钻石。由于大多数绝缘体F0­值都在“塑料和玻璃”区间内,我们使用4%代表所有绝缘体的F0­值。



半导体的F0­值




那么半导体呢?正如你所预料的,它们的F0­值介于最明亮的半导体和最黑暗的金属之间,例如上图所示的硅。通常我们看不到生产中的半导体表面,所以出于实用考虑20%到40%的范围是F0­值的“禁止出现区域”。现实物体表面的F0­值应避免落在这一区域。



菲涅尔反射率




我们介绍了如何得到0度的菲涅尔反射率。那么如何得到其它角度的值呢?



菲涅尔值的施利克近似(Schlick Approximation)


  • 非常精确,简洁,用F0参数化的方法:




  • 用于微平面BRDF(m=h)的方法:




在生产中,施利克近似法很常见。它简单且相当精确;更重要的是,它使用高光色进行参数化。如我们之前所见,当在微平面BRDF中使用它时,我们用h向量代替法向量。



正态分布




接下来我们讲微平面BRDF中的微平面正态分布(NDF,Normal Distribution Function)。NDF表示的是相对于表面区域,指向特定方向(本例中为半角方向)的微平面法线的密集程度。NDF决定了高光的大小和形状。




课程笔记中详细介绍了可用的不同NDF。




一些NDF为“水滴状”高光的高斯分布……




其它的形状上更“尖”,尾部很长,导致高光部分很小,周围有“光晕”环绕。




许多表面不能使用这样平滑的函数表示。我将要使用Yan 等人去年发表的闪光渲染的论文来说明这一点。用于生产的BRDF函数与法线贴图过滤技术使用平滑的耳垂形,它们在各方向同性……




……或者各方向异性。然而,许多面有相对粗糙的微米几何,使得NDF看上去像……




……这样,表面发生闪光。虽然去年的“闪光渲染”论文提出了一种可用于电影制作的方法,对于游戏制作来说太费钱了。游戏会继续使用更多的ad-hoc(点对点)方法;今年的“高阶实时渲染”课程中介绍的雪花效果是一个很好的例子。




我们使用NDF解释表面变形的现象。以下图片节选自Nagano等人的“皮肤微结构变形”论文。我将在今天下午的“外观捕获”部分展示它。左图展示的是不同程度的挤压和伸展下的一小块皮肤;它的NDF显示在右图中。




我们可以看到皮肤从被挤压到被伸展的变化,它的NDF相应地改变。









虽然这个论文是关于皮肤的,这一类的变化会出现在任何柔韧物体的表面上。



几何函数




几何函数,或称阴影遮盖函数,表现的是特定方向上(同样,这里指的是半角方向)的微平面被照亮并且从入射光方向和视角方向可见(换句话说,没有阴影或没有遮盖)的概率。




供选择的几何函数有很多。但是,Eric Heitz指出(推荐阅读他的完整分析),……




……只有史密斯函数(此处为无关联形式)在数学上成立且在物理中实际可行。更多的细节(包括史密斯函数的不同形式)可以在Heitz的论文中找到。




综上,我们得出BRDF正比于活跃微平面(法线与h在同一条线上)的密集度乘以可见度乘以菲涅尔反射率。剩余的BRDF部分(分母部分)包含一个矫正因子,与不同的结构有关(光的结构,视觉的结构,临近表面的结构)。



表面下反射(漫反射项)




到目前为止我们集中讲解了高光(表面)反射项。接下来,我们快速讲一下漫反射(或者平面下反射)项。



兰伯特模型


  • 常数(n·l是反射率方程的一部分)




  •   Cdiff:光被反射的部分,或者叫漫射颜色。


兰伯特模型是游戏和电影制作中常用的漫射术语。它是BRDF最简单的一种形式:一个常数。Cosine因子是反射率方程的的一部分,而不是BRDF的。



跨越兰伯特模型:漫反射-高光的权衡




有几个重要的物理现象是兰伯特模型解释不了的。漫反射现象来源于光的折射。由于高光来自表面反射,某种程度上它继承了入射光的主体而散射光得到剩余的部分。由于表面反射率在掠射角达到100%,漫射率将降为0%。课程笔记对此作了一些讨论。



跨越兰伯特模型:表面粗糙度




兰伯特模型同样不能解释表面粗糙问题。大多情况下,微观的粗糙程度只会影响高光。某一点的漫反射来自于一个区域内的入射光,大大平均掉所有微米几何差异。但是某些表面的微米几何要大于散射距离,对漫反射造成影响。这时候我们需要用到诸如OrenNayer的模型。



漫反射粗糙程度=高光反射粗糙程度


目前普遍对所有表面使用像Oren-Nayer或者“迪士尼漫反射”的粗糙漫反射模型,在其中加入高光粗糙。但是我想要借此机会指出该方法的问题。





漫反射粗糙程度不等于高光反射粗糙程度


从LightState的漫反射和高光法线贴图中可以看出漫反射有效地缓和了不平的地方。但是对粗糙部分更是如此:理想状态下你应该在这些模型中使用不同的粗糙值;或者只对微米几何大于散射距离的物体使用。




我将简短地回到波物理这一话题。估计你们以为我已经忘记它了。



光学平面的衍射




除了少数例外,计算机图像研究者不是忽略了纳米几何衍射的效果,就是表示它们不重要。然而,在最新的Material Appearance Modeling研讨会中,Holzschuch和Pacanowski展示了令人信服的证据证明可见的BRDF行为的一部分(例如高光的“长尾巴”部分)就是这个现象造成的。



微米几何和纳米几何


微米几何                                       纳米几何

表面统计数据(微米级别NDF)    表面统计数据(纳米级别SPD)

决定的耳垂形状                            决定的耳垂形状

无波长依赖                                   依赖强波长

入射角也许会通过可见度影响        入射角也许会通过缩短法(forshortening)

表面统计数据                                影响表面统计数据



对许多材料来说,反射率受微米级别和纳米级别粗糙度的影响。我会介绍一些两者高级程度的差异;详细内容请见Holzschuch&Pacanowski的演讲。纳米级耳垂形状受表面SPD(和我们之前提到的SPD相似,但是是在二维平面中的频率而不是一维波的频率)的影响。



数学——>渲染


当数学部分搞明白后,下一步就是在电影和游戏的渲染器中实现了。我的课程笔记有一些关于此的背景介绍。另外这门课程的产业演讲(今年和前些年都有)包括许多的细节。



鸣谢


  • Steve Hill:帮助整理课程笔记和幻灯片,菲涅尔视图的WebGL框架

  •  Brent Burley,Paul Edelstein,Yoshiharu Gotanda,Eric Heitz,Christophe Hery,Sebastien Lagarde,Dimitar Lazarov,Cedric Perthuis,Brian Smits:对于PBR模型启发式的讨论

  • A K Peters,ACM,“Rendering Glints on High-Resolution Normal-Mapped Specular Surfaces”和“Skin Microstructure Deformation with Displacement Map Convolution”论文的作者:允许我使用图片



我想感谢帮助我准备此次演讲的人……



……结尾注明2K正在招人:我们的工作室有一些空着的职位,我所在的中央技术部门正在招顶级渲染&引擎程序员。


【版权声明】

原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权。


点击一下立即阅读相关好文章


《贪婪》谈贪婪设计腾讯GAD游戏创新大赛


游戏美术3D设计干货回顾为VR优化UE4渲染器


这么做设计才好玩Unity教程


MOBA类游戏核心设计分析

......

近期热文

Offer攻略:写给立志做程序员的应届毕业生们

Unix昔日之魂(三):不可修复设计


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存