目录
综述
- 标准光照模型仅仅是一个经验模型,并不完全复合真实世界中的光照现象。
- 计算光照模型时,需要统一各个方向矢量所在的座标空间,且方向都是从该点指向其他处的。
- 渲染包含了两大部分:决定一个像素的可见性,决定这个像素上的光照计算。而光照模型是用于决定在一个像素上进行怎样的光照计算。
- 如何量化光?
在光学中,使用辐照度来量化光。对于平行光来说,它的辐照度可通过计算在垂直于 l(光照方向)的单位面积上单位时间穿过的能量来得到。
在计算光照模型时,需要知道一个物体表面的辐照度,而物体表面往往是和 l 不垂直的,可以使用光源方向 l 和表面法线 n 之间夹角的余弦值来得到。需要注意的是,这里默认方向矢量的模都为 1。 - 根据入射光线的数量和方向,可以计算出出射光线的数量和方向,使用出射度来描述它。辐照度和出射度之间是满足线性关系的,而它们之间的比值就是材质的漫反射和高光反射属性。
- 着色
着色指的是根据材质属性(如漫反射属性等)、光源信息(如光源方向、辐照度等),使用一个等式去计算沿某个观察方向的出射度的过程。这里使用的等式也被称为光照模型(Light Model)。
在渲染中,通常会基于表面的入射光线的入射辐射率 Li 来计算出射辐射率 Lo。这个过程往往被称为是着色过程。 - BRDF 光照模型
当给定模型表面上的一个点时,BRDF 包含了对该点外观的完整的描述。在图形学中,BDRF 大多使用一个数学公式来表示,并提供了一些参数来调整材质属性。通俗来讲,当给定入射光线的方向和辐照度后,BDRF 可以给出某个出射方向上的光照能量分布。
准光照模型
- 标准光照模型只关心直接光照,也就是那些直接从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。
- 它的基本方法是,把进入到摄像机内的光线分为 4 个部分,每个部分使用一种方法来计算它的贡献度。
自发光(Cemissive)
这部分用于描述当给定一个方向时,模型表面会向该方向发射多少的辐射量。当没有使用全局光照时,这些自发光表面不会照亮周围物体,只是本身看起来更亮而已。
高光反射(Cspecular)
这个部分用于描述当光线从光源照到模型表面时,模型镜面反射产生的光。
漫反射(Cdiffuse)
这个部分用于描述当光线从光源照到模型表面时,模型向各个方向产生的光。
环境光(Cambient)
这个部分用来描述其他间接的光。
标准光照模型公式
环境光
虽然标准光照模型的重点在于描述直接光照,但在真实的世界中,物体也可以被间接光照所照亮。间接光照指的是,光线通常会在多个物体之间反射,最后进入摄像机。也就是说,在光线进入摄像机之前,经过了不止一次的物体反射。例如,在红地毯上放置一个浅灰色的沙发,那么沙发底部也会有红色,这些红色是由红地毯反射了一部分光线,在反弹到沙发上的。
在标准光照模型中,使用环境光部分来近似模拟间接光照。环境光通常是一个全局变量,即场景中的所有物体都是用这个环境光。
Unity -> Window -> Rendering -> Light Setting 中设置。
内置变量 UNITY_LIGHTMODEL_AMBIENT 可以得到环境光的颜色和强度信息。
自发光
光线可以直接由光源发射进入摄像机,而不需要经过任何物体的反射。标准光照模型使用自发光来计算这部分的贡献度。它的计算比较简单,直接使用该材质的自发光颜色。
计算自发光,只需要在片元着色器最后输出的颜色之前,把材质的自发光颜色添加到输出颜色上即可。
漫反射
漫反射,是投射在粗糙表面上的光向各个方向反射的现象。当一束平行的入射光线射到粗糙的表面时,表面会把光线向着四面八方反射,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射,这种反射称之为“漫反射”或“漫射”。这种反射的光称为漫射光。很多物体,如植物、墙壁、衣服等,其表面粗看起来似乎是平滑,但用放大镜仔细观察,就会看到其表面是凹凸不平的,所以本来是平行的太阳光被这些表面反射后,弥漫地射向不同方向。
漫反射光照符合兰伯特定律:反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。漫反射部分的计算如下:
n 表面法线
I 指向光源的单位矢量
Mdiffuse 材质的漫反射颜色
Clight 光源颜色
max 防止物体被从后面来的光源照亮
高光反射
经验模型,它并不完全符合真实世界中的高光反射现象。它可用于计算那些沿着完全镜面反射方向被反射的光线(物体直接反射光源),他可以让物体看起来是光泽的,例如金属材质。
Phong 模型计算高光反射的部分:
Mgloss 光泽度,反光度,控制高光区域的大小,值越大,亮点越小
Mspecular 材质的高光反射颜色,它用于控制该材质对于高光反射的强度和颜色
Clight 光源颜色和强度
v 是视角方向
r 是反射方向,可以通过计算反射方向的函数
r = reflect(I,n)
I,入射方向
n 法线方向
r = 2 (n * I)* n - I 菱形
Blinn 模型的公式
h = normalize(v + I)
比较
在硬件实现时,如果摄像机和光源距离模型足够远的话,Blinn模型会快于Phong模型,因为此时可以任务 v 和 I 都是固定值,因此 h 将是常量。但是当 v 和 I 不固定时,Phong模型可能反而更快一些
逐像素还是逐顶点?
逐顶点
- 顶点着色器中;
- 也被称为高洛德着色。在每个顶点上计算光照,然后会在渲染图元内部进行线性插值,最后输出成像素颜色;
- 优点:
由于顶点数目往往远小于像素数目,因此逐顶点光照的计算量往往要小于逐像素光照; - 缺点:
- 由于逐顶点光照依赖于线性插值来得到像素光照,因此,当光照模型中有非线性的计算(如计算高光反射时),逐顶点光照就会出问题。
- 由于逐顶点光照会在渲染图元内部对顶点颜色进行插值,这会导致渲染图元内部的颜色总是暗于顶点处的最高颜色值,这在某些情况下会产生明显的棱角现象。
逐像素
- 片元着色器中;
- 以每个像素为基础,得到它的法线,然后进行光照模型计算。这种在面片之间对顶点法线进行插值的技术被称为 Phong 着色。