我们是如何看到这个世界的
需要考虑三种物理现象
(1)首先,光线从光源被发射出来
(2)然后,光线和场景中的物体相交:一些光线被吸收,一些光线被散射到其他方向。
(3)最后,摄像机吸收了一些光,产生了一张图像
光源
把光源当成一个没有体积的点,用 l
来表示它的方向。
我们使用辐照度来量化光。平行光的辐照度可通过计算在垂直于 l
的单位面积上单位时间内穿过的能量来得到。可以通过使用光源方向 l 和表面法线 n 之间的夹角的余弦值来得到。默认方向矢量的模为1。
辐照度和照射到物体表面时光线的距离\frac{d}{cos\theta}成反比,因此辐照度和cos\theta成正比。cos\theta可以用光源方向 l 和表面法线 n 的点积来得到。
吸收和散射
散射只改变光线的方向,不改变光线的密度和颜色。吸收只改变光线的密度和颜色,不改变光线的方向。
光线在经表面散射后:一种会散射到物体内部,称为折射或透射;一种会散射到外部,称为反射。对于不透明物体,折射进入物体内部的光线还会继续与内部的颗粒进行相交,其中一些光线最后会重新发射出表面,另一些则被物体吸收。从物体表面重新发射的光线将具有和入射光不同的方向分布和颜色。
为区分这两种不同的反射,我们使用不同的部分来计算它们:高光反射部分表示物体表面是如何反射光线的,而漫反射部分则表示有多少光线会被折射、吸收和散射出表面。根据入射光线的数量和方向,我们可以计算出射光线的数量和方向,通常用出射度来描述。辐照度和出射度之间满足线性关系,它们之间的比值就是材质的漫反射和高光反射属性。
着色
着色指的是,根据材质信息、光源信息,使用一个等式去计算沿某个观察方向的出射度的过程。把这个等式称为光照模型。
BRDF光照模型
当给定模型表面一个点时,BRDF包含了对该点外观的完整的描述。在图形学中,BRDF大多使用一个数学公式来表示,并提供一些参数来调整材质属性。当给定入射光线的方向和辐照度后,BRDF可以给出在某个出射方向上的光照能量分布。
标准光照模型
标准光照模型只关心直接光照,就是直接从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。分为四部分
(1)自发光部分(emissive),用c_{emissive}表示。用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。注意:如果没使用全局光照,这些自发光表面并不会照亮周围物体,只是让它本身看起来更亮。
(2)高光反射部分(specular),用c_{specular}表示。用于描述当光线从光源照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。
(3)漫反射部分(diffuse),用c_{diffuse}表示。用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。
(4)环境光部分(ambient),用c_{ambient}表示。用于描述其他所有的间接光照。
环境光
真实世界中,物体可以被间接光照照亮。在光线进入摄像机前,经过不止一次的物体反射。我们使用环境光来模拟间接光照。它通常是一个全局变量,即场景中所有的物体都使用这个环境光。
c_{ambient}=g_{ambient}
自发光
光线也可以直接由光源发射进入摄像机,而不需要经过任何物体反射。直接使用该材质的自发光颜色。
c_{emissive}=m_{emissive}
自发光的表面不会照亮周围的表面,这个物体不会被当成光源。
漫反射
用于对被物体表面随机散射到各个方向的辐射度进行建模的。视角位置不重要,入射光线角度很重要。
漫反射符合兰伯特定律:反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。
c_{diffuse}=(c_{light}\cdot m_{diffuse})max(0,\hat{n}\cdot \hat{l})
其中,\hat{n}是表面法线,\hat{l}是光源的单位矢量,m_{diffuse}是材质的漫反射颜色,c_{light}是光源颜色。
我们需要防止法线和光源方向的点乘的结果为负值,因此使用max函数将其截取到0,可防止物体被从后面来的光源照亮。
高光反射
可用于计算沿着完全镜面反射方向被反射的光线。
计算高光反射需要知道的信息比较多,表面法线、视角方向、光源方向、反射方向等。假设这些矢量都是单位矢量。
其中,反射方向可以通过其他信息计算得到
\hat{r} =2(\hat{n}\cdot \hat{l})\hat{n}-\hat{l}
这样,可以用Phong来计算高光反射部分
c_{specular}=(c_{light}\cdot m_{specular})max(0,\hat{v}\cdot \hat{r})^{m_{gloss}}
其中,m_{gloss}是材质的光泽度(gloss),也被称为反光度。用于控制高光区域的“亮点”有多宽,m_{gloss}越大,亮点越小。m_{specular}是材质的高光反射颜色,用于控制该材质对高光反射的强度和颜色。c_{light}则是光源的颜色和强度。这里也需要防止\hat{v}\cdot \hat{r}结果为负数。
Blinn提出了一个简单的修改方法来得到类似的效果。
避免计算反射方向\hat{r},为此引入了一个新矢量\hat{h},通过对\hat{v}
和