[UnityShader入门精要读书笔记]08.Unity中基础光照

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

散射只改变光线的方向。光线在物体表面经过散射后,有两种方向:一种会散射到物体内部,这种现象被称为折射或者透射;另一种将会散射到外部,这种现象称为反射。

[UnityShader入门精要读书笔记]08.Unity中基础光照

为了区分这两种不同的散射方向,我们在光照模型中使用了不同的部分来计算它们:高光反射和漫反射。

高光反射部分表示物体表面是如何反射光线的,而漫反射部分则表示有多少光线会被折射、吸收和散射出表面。

根据入射光线的数量和方向,我们可以计算出射光线的数量和方向,我们通常使用出射度来描述它。辐射度和出射度之间是满足线性关系的,而它们之间的比值就是材质的漫反射和高光反射属性。

标准光照模型:

标准光照模型只关心直接光照,也就是那些直接从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。它的基本方法是,把进入到摄像机内到光线分为4部分,每个部分使用一种方法来计算它的贡献度。

[UnityShader入门精要读书笔记]08.Unity中基础光照

1.环境光

虽然标准光照模型的重点在于描述直接光照,但在真实的世界中,物体也可以被间接光照所照亮。间接光照指的是光线通常会在多个物体之间反射,最后进入摄像机,也就是说,在光线进入摄像机之前,经过了不止一次的物体反射。在标准光照模型中,我们使用了一种被称为环境光的部分来近似模拟间接光照。环境光的计算非常简单,它通常是一个全局变量,即场景中的所有物体都使用这个环境光。[UnityShader入门精要读书笔记]08.Unity中基础光照

2.自发光 

光线也可以直接由光源发射进入摄像机,而不需要经过任何物体反射。标准光照模型使用自发光来计算这个部分的贡献度。它的计算也很简单,就是直接使用了该材质的自发光颜色。[UnityShader入门精要读书笔记]08.Unity中基础光照

 

3.漫反射

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

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

[UnityShader入门精要读书笔记]08.Unity中基础光照

4.高光反射

这里的高光反射是一种经验模型,并不完全符合真实世界中的高光反射现象。它可用于计算那些沿着完全镜面反射方向被反射的光线,让物体看起来有光泽。计算高光反射需要知道的信息比较多,如表面法线,视角方向,光源方向,反射方向等。

[UnityShader入门精要读书笔记]08.Unity中基础光照

[UnityShader入门精要读书笔记]08.Unity中基础光照

对于光照模型的计算,我们有两种选择,在片元着色器中计算,也被称为逐像素光照,在顶点着色器中计算,也被称为逐顶点光照。

在逐像素光照中,我们会以每个像素为基础,得到它的法线,然后进行光照模型的计算。这种在面片之间对顶点法线进行插值的技术称为Phong着色,也称为Phong插值或法线差值着色技术。

与之对应的逐顶点光照,也被称为高洛德着色。在逐顶点光照中,我们在每个顶点上计算光照,然后会在渲染图元内部进行线性插值,最后输出成像素颜色。由于顶点数目往往小于像素数目,因此逐顶点光照的计算量往往要小于逐像素光照。但是,由于逐顶点光照依赖于线性插值来得到像素光照,因此,当光线模型中有非线性的计算时,逐顶点光照就会出问题。