unity shader基础之——unity光源、光照模型、光照类型

一、我们是如何看到这个世界的?

当我们描述一个物体的是红色的时候,实际上是因为这个物体会反射更多的红光波长,而吸收了其他波长。如果一个物体看起来是黑色的,实际上因为吸收了绝大部分的波长,这种物理现象就是下面要讨论的。

如果要模拟真实光照来生成一张图像,需要考虑3种物理现象。

(1)首先光从光源被发射出来。

(2)光线和场景中的一些物体相交,一些光线被物体吸收了,而另一些光线被散射到其他方向。

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

1.1 光源

实时渲染中我们通常把光源当成一个没有体积的点,用l表示它的方向。那么如何测试一个光源发射出了多少光呢?也就是说如何量化光?在光学中使用辐照度去量化。对于平行光来说,它的辐照度可通过计算在垂直于l的单位面积上单位时间内穿过的能量来得到。在计算光照模型时,我们需要知道一个物体表面的辐照度,而物体表面往往是和l不垂直的,我们可以使用光源方向l和表面法线n之间的夹角的余弦值得到辐照度。

unity shader基础之——unity光源、光照模型、光照类型

因为辐照度和照射到物体表面时光线之间的距离d/cosα成反比的,因此辐照度就和cosα成正比, cosα可以使用光源方向l和表面法线n的点积得到,这就是使用点积来计算辐照度的由来。

1.2 吸收和散射

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

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

unity shader基础之——unity光源、光照模型、光照类型

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

本节我们假设漫反射部分是没有方向性的,也就是说光线所有方向上是平均分布的。同时也只考虑一个特定方向上的高光反射。

1.3 着色

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

1.4 BRDF光照模型

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

二、标准光照模型

标准光照模型只关心直接光照,也就是那些直接从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。

它的基本方法是,把进入到摄像机内的光线分为4个部分,每个部分使用一种方法来计算它的贡献度:

(1)自发光部分,Cemissive,这个部分用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。如果没有使用全局光照技术,这些自发光表面并不会真的照亮周围的物体,而是它本身看起来更亮了而已。

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

(3)漫反射部分,Cdiffuse,这个部分用于描述从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。

(4)环境光部分,Cambient,它用于描述其他所有的间接光照。

2.1 环境光

虽然标准光照模型的重点在于描述直接光照,但在真实世界中,物体也可以被间接光照所照亮。间接光照指的是,光线通常会在多个物体间反射,最后进入摄像机,也就是说在光线进入摄像机之前,经过了不止一次的物体反射。例如在红地毯上放置一个浅灰色的沙发,那么沙发底部也会有红色,这些红色是由红地毯反射了一部分光线,再反弹到沙发上的。

在标准光照模型中,我们使用了一种被称作环境光的部分来近似模拟间接光照,环境光的计算很简单,通常是一个全局变量,场景中所有物体都使用这个环境光,下面等式给出了计算环境光的部分:

Cambient=Gambient

2.2 自发光

光线也可以直接由光源发射进入摄像机,而不需要经过任何物体的反射。标准光照模型使用自发光来计算这个部分的贡献度。它的计算也很简单,直接使用了该材质的自发光颜色:

Cemissive=Memissive

通过在实时渲染中,自发光表面往往不会照亮周围表面,也就是说这个物体并不会被当成一个光源。unity引入的全新全局光照系统则可以模拟这类自发光物体都周围物体的影响。

2.3 漫反射

漫反射光照是用于对那些被物体表面随机散射到各个方向的辐射度进行建模的。在漫反射中,视角的位置是不重要的,因为反射是完全随机的,因此可以认为在任何发射方向上的分布都是一样的。但是入射光线角度很重要。

漫反射光照符合兰伯特定律,反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。

2.4 高光反射

这里的高光反射是一种经验模型,也就是说不完全符合真实世界中的高光反射现象。它可以用于计算那些沿着完全镜面反射方向被反射的光线,这可以让物体看起来是有光泽的,例如金属材质。

计算高光反射需要知道的信息比较多,如表面法线、视角方向、光源方向、反射方向等。

这四个矢量我们实际上只需要知道其中三个,第四个反射方向可以通过其他信息计算得到,Blinn模型的公式如下:

Cspecular = Clight * mspecular * pow(max(0, dot(n, h), gloss))

其中gloss是材质的光泽度,也被称为反光度。它用于控制高光区域的'亮点'有多宽,gloss越大,亮点就越小。mspecular是材质的高光反射颜色,它用于控制该材质对于高光反射的强度和颜色。Clight则是光源颜色。

在硬件实现时,如果摄像机和光源距离模型足够远的话,Blinn模型会快于Phong模型。

2.5 逐像素还是逐顶点

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

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

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

2.6 总结

虽然标准光照模型仅是一个经验模型,他并不完全符合真实世界中的光照现象。但由于它的易用性、计算速度和得到的效果都比较好,因此仍然被广泛使用。这种标准光照模型有很多不同的叫法,一些资料中叫他Phong光照模型,而后由于Blinn方法简化了计算而且在某些情况下计算更快,我们把这种模型称为Blinn-Phong光照模型。

但这种模型有很多局限性,很多重要的物理现象无法用Blinn-Phong模型表现出来,例如菲涅耳反射。其实Blinn-Phong模型是各项同性的,也就是说当我们固定视角和光源方向旋转这个表面时,反射不会发生任何改变。但有些表面是具有各向异性(anisotropic)反射性质的,例如拉丝金属、毛发等。后面会讲一下基于物理的光照模型,这些光照模型更加复杂,同时也可以更加真实地反映光和物体的交互。

这节主要讲的是unity中的光照模型及其原理,还有几种光照类型(自发光、环境光、漫反射、高光反射),下一节就开始实现这几种光照类型。

本文转自 CSDN,为博主 小橙子0 原创文章,
遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
https://blog.csdn.net/cgy56191948/article/details/102378041

最新文章