Unity Shader入门精要笔记_6.1~6.3_基础光照知识、标准光照模型和Unity中的环境光和自发光

时间:2021-01-25 10:23:14

第6章 Unity中的基础光照

渲染总是围绕着一个基础的问题:我们如何去决定一个像素的颜色?从宏观上来说,渲染包含了两大部分:1)决定一个像素的可见性;2)决定这个像素上的光照运算;而光照模型就是用于决定在一个像素上进行怎样的光照运算。

 

6.1 我们是如何看到这个世界的

通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑三种物理现象:

首先,光源从光源中被发射出来。

然后,光线和场景中的一些物体相交:一些光线被物体吸收了,而另一些光线被散射带其它方向。

最后,摄像机吸收了一些光,产生了一张图像。

 

6.1.1_光源

在光学中我们使用辐照度来量化光。对于平行光来说,它的辐照度可通过计算在垂直光线方向l的单位面积单位时间内穿过的能量来得到。在计算光照模型时,我们需要知道一个物体表面的辐照度,而物体表面往往是和l不垂直的,那么如何计算这样的表面辐照度呢?我们可以使用光源方向l和表面法线n之间的夹角的余弦值得到。需要注意的是,这里默认方向的矢量的模都为1。

 

6.1.2_吸收和散射

光线由光源发射出来后,就会与一些物体相交。通常,相交的结果有两个:散射和吸收。

散射只改变光线的方向但不改变光的密度和颜色,而吸收只改变光的密度和颜色但不改变光线的方向。光线在物体的表面经过散射后,有两种方向:一种将会散射到物体的内部,这种现象称为折射或透射;另一种将会散射带外部,这种现象被称为反射对于不透明的物体,折射进入物体内部的光线还会继续与内部的粒子进行相交,其中一些光线最后会重新发射出物体的表面,而另一些则被物体吸收。哪些从物体表面重新发射出的光线将具有和入射光线不同的方向分布和颜色。

为了区分别这两种不同的散射方向,我们在光照模型中使用了两种不同的部分来计算他们:高光反射部分表示物体表面是如何反射光线的,而漫反射部分则表示有多少光线会被折射、吸收和散射出表面。根据入射光线的数量和方向,我们可以计算出射光线的数量和方向。我们通常可以用出射度来描述它。辐照度和出射度之间是满足线性关系的,而它们之间的壁纸就是材质的漫反射和高光反射属性。

在本章的学习中我们假设漫反射部分是没有方向性的,也就是说光线在所有方向上是平均分布的,并且同时我们也只考虑同一个方向上的高光反射。

 

6.1.3_着色

着色指的是根据材质的属性(如漫反射属性等),光源信息(如光源方向、辐照度等),使用一个等式去计算沿某个观察方向的出射度的过程。我们也把这个等式称为光照模型,。不同的光照模型有不同的目的,例如一些用于描述粗糙物体的表面,一些用于描述金属表面等。

 

6.1.4_BRDF光照模型

当已知光源的位置、方向和视角方向时,我们就需要知道一个表面是如何和光照进行交互的。例如当光线从某个方向照射到一个表面上时,有多少光线被反射?反射的方向有哪些?而BDRF就是用来回答这些问题的。当给定模型表面上的一个点时,BRDF包含了对该点外观的完整描述。在图形学中,BRDF大多使用一个数学公式来表示,并且提供了一些参数来调整材质属性。通俗地来讲,当给定入射光线的方向和辐照度后,BRDF可以可以给出在某个方向上的光照能量分布。本章涉及的BRDF都是对真实场景进行理想化和简化后地模型,也就是说它们并不能真实地反映物体和光线之间的交互。

 

6.2 标准光照模型

光照模型分为很多种类,在早期的游戏引擎之中往往只使用一个光照模型,这个模型被称为标准光照模型。标准光照模型只关注直接光照,也就是哪些直接从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。它将进入摄像机的光线分为四个部分,每个部分使用一定的方法来计算它的贡献度:

C emissive自发光部分:这个部分用于表示当给定一个方向的时候,一个表面本身会向该方向发射多少辐射量。需要注意的是,如果没有使用全局光照技术,这些自发光的表面并不会照亮周围的物体,而是它本身看起来更亮了而已。

C specular高光反射部分:这个部分用于描述当光线从光源照射到模型的表面时,该表面会在完全镜面的方向散射多少辐射量。

C diffuse 漫反射部分:这个部分用于描述,当光线从光源照射到模型表面的时候,该表面会向各个方向散射多少辐射量。

C ambient环境光部分:它用于描述其它所有的间接光照。

 

6.2.1_环境光

虽然标准光照模型的重点在于描述直接光照,但是在现实的世界中物体也可以被间接光照所照亮。间接光照所指的是,光线从光源发出以后往往会经过多个物体表面所反射,最后才进入我们的摄像机。也就是说间接光照的光源在进入到我们的摄像机之前经过了不止一次物体反射。例如将白色的小球放在红色的地毯之上,白色小球的底部总会看到一部分表面是红色的,这是因为红色地毯反射了光线中的红色部分照射到了白色小球的底部。

在标准光照模型中,我们使用了一种被称为环境光的部分来描述和近似模拟间接光照。环境光的计算非常简单,他是一个全局变量,即在我们搭建的场景中所有的物体都使用这个环境光。

6.2.2_自发光

光线也可以由光源直接进入摄像机而不用经过任何物体的反射。标准光照模型使用了自发光来描述这个部分的辐照量贡献程度。它的计算也是非常简单的,就是直接使用了该材质的自发光颜色。通常在渲染之或者是在早期的渲染引擎之中,自发光的物体是不会照亮其周围的表面,也就是说,这个物体并不会被当成一个光源。在新版Unity中的全局光照系统则可以模拟这类自发光物体对周围环境的影响。

6.2.3_漫反射

漫反射是用于对那些被物体表面随机散射到各个方向的辐照度进行随机建模的。在漫反射中,视角的位置是不重要,因为可以认为在任何反射方向上的分布都是一样的。但是入射光线的角度是非常重要的。漫反射光照符合兰伯特定律:即反射光线的强度与法线和光源之间的夹角的余弦值成正比。

6.2.4_高光反射

这里的高光反射是一种经验模型,也就是说它并不符合真实世界中的高光反射现象。它可用于计算那些完全沿着镜面反射方向反射的光线,这可以使得物体看起来是有光泽的,例如金属材质等。计算高光反射需要的信息比较多,比如表面法线、视角方向、光源方向、反射方向等,在这四个矢量中,我们实际上只需要知道其中的三个矢量即可,而反射方向可以通过其它信息计算得到。

6.2.5_逐像素还是逐顶点

上面我们给出了基本光照模型使用的数学公式,那么我们在哪里计算这些光照模型呢?通常来讲,我们有两种选择:在片元着色器中计算,也被称为逐像素光照,即per-pixel lightting;在顶点着色器中进行计算,也被称为逐顶点光照,即per-vertexlightting。

在逐像素光照中,我们会以每个像素为基础,得到他们的法线(可以是对顶点法线进行插值得到的,也可以是从发现纹理中采样得到的),然后进行光照模型的计算。这种在面片之间进行插值的技术被称为Phong着色,即Phong shading,也被称为Phong插值或者法线插值着色技术,这不同于我们之前所说的Phong光照模型。

与之相对的便是逐顶点光照,也被称为高罗德着色,即Gouraud shading。在逐顶点光照中,我们在每个顶点上计算光照,然后会在渲染图元内进行线性插值,最后输出成像素颜色。由于顶点数目往往小于像素数目,因此逐顶点光照的计算量往往要小于逐像素光照。但是由于逐顶点光照往往依赖于线性插值来的带像素光照,因此当光照模型中有非线性的计算(例如计算高光反射)时,逐顶点光照就会出现问题。而且由于逐顶点光照会在渲染图元内部对顶点颜色进行插值,这会导致渲染图元内的颜色总是暗于顶点处的最高颜色值,这在某些情况下会产生明显的棱角现象。

 

6.2.6_总结

虽然标准光照模型仅仅是一个经验模型,也就是说他并不完全符合真实世界中的光照现象,但是由于它的易用性、计算速度和得到的效果都比较好,因此仍然被广泛的使用。而正是由于它的广泛使用性,这种标准光照模型拥有很多不同的叫法,一些资料中称它为Phong光照模型,因为Pong首先提出了使用漫反射和高光反射的和来对反射光线进行建模的基本思想,并且提出了基于经验的计算高光反射的方法,而后,由于Blinn的方法简化了计算而且在某些情况下计算更快,我们把这种模型称为Blinn-Pong光照模型。

但是这种光照模型有很多的局限性,首先有很多的物理现象无法用Blinn-Pong模型表现出来,例如菲涅尔反射。此次Blinn-Pong模型是各项同性的,也就是说,当我们固定视角和光源方向旋转这个表面时,反射不会发生任何改变。但是有些表面时具有各向异性反射性质的,例如拉丝金属、毛发等的。