おたくのスタジオ

基本光照模型

本篇文章主要分析Direct3D中的固定功能光照模型。这个基本模型对经典的Phong模型进行了修改和扩展。关于不同的光照模型,将留到后续文章中介绍。在基本模型中,一个物体的表面颜色是放射(emissive)、环境反射(ambient)、漫反射(diffuse)和镜面反射(specular)等光照作用的总和。每种光照作用取决于表面材质的性质(例如亮度和材质颜色)和光源的性质(例如光的颜色和位置)的共同作用。用公式描述如下:
$$
surfaceColor = emissive + ambient + diffuse + specular
$$

放射项

放射项表示了由表面所发出的光。这种光照作用是独立于所有光源的。放射项指明了表面所发出光的颜色。如果你在一个完全黑暗的房间里观察一种放射性材质,它将呈现出这种颜色。放射颜色在物体表面的所有地方都是一样的。一个物体的放射性发光在场景中并不照亮附近的其他物体。一个放射性物体本身并不是一个光源——它不照亮其他物体或投下阴影。用于放射项的数学公式如下:
$$
emissive = K_e
$$
$K_e$代表材质的放射光颜色。

环境反射项

环境反射项代表了光在一个场景里经过多次折射后看起来就像来自四面八方一样。环境反射光看起来并不是来自某个方向的,相反它看起来像是来自所有方向。因此,环境反射项并不依赖于光源的位置。环境反射项依赖于一个材质的环境反射能力,以及照射到材质上的环境光的颜色。和放射项一样,环境反射项依赖于它本身,是一种固定的颜色。但是不像放射颜色,环境反射项受全局环境光照的影响。用于环境反射项的数学公式如下:
$$
ambient = K_a \times globalAmbient
$$
其中,$K_a$是材质的环境反射系数,$globalAmbient$是入射环境光的颜色。

下面两张图片显示了材质颜色,为灰色,和光的颜色,为红色。

basic-lighting-f

渲染得到的场景如下所示。场景中唯一的物体是一个球体。环境光用相同的颜色对物体的所有顶点进行光照计算,它不依赖于顶点法向和光的方向。因此,球体看起来像是二维的圆,因为物体的表面没有明暗变化。要使物体看起来更真实,除了环境光之外,需要再添加漫反射光或镜面反射光。

basic-lighting-g

漫反射项

漫反射项代表了从一个表面相等地向所有方向反射出去的方向光。通常漫反射表面在微观尺寸上是非常粗糙的,有很多向很多方向反射光线的凹坑和裂缝。当入射光线到达这些凹坑和裂缝的时候,光线会向各个方向反射。

光的反射量与光到达表面的入射角度成正比。无论视点在哪里,一个表面上任何一点的漫反射影响都是一样的。用于漫反射项的数学公式如下:
$$
diffuse = K_d \times lightColor \times max(N \cdot L, 0)
$$
basic-lighting-a

其中:

  • $K_d$是材质的漫反射颜色
  • $lightColor$是入射漫反射光的颜色
  • $N$是规范化的表面法向量
  • $L$是规范化的指向光源的向量
  • $P$是被着色的点

易知,规范化的向量$N$和$L$之间的夹角越小,点积的值越大,而表面会受到更多的入射光照。背向光源的表面将产生负的点积值,公式确保这样的表面不会显示漫反射光照。

下面两张图片显示了材质颜色,为灰色,和光的颜色,为红色。

basic-lighting-f

渲染得到的场景如下所示。场景中唯一的物体是一个球体。漫反射光照计算取得材质和光的漫反射色,用光的方向和顶点法向的点积作为它们之间的夹角修正得到的颜色。因此,球体的后面变得较黑,因为那部分球面背向光源。

basic-lighting-h

将漫反射光和前例产生的环境光结合起来,会使物体的整个表面呈现出明暗效果。环境光使整个表面变亮,而漫反射光则有助于展现出物体的三维形状。漫反射光比环境光需要更多的计算,因为它依赖于顶点的法向和光的方向。我们可以看一下在三维场景中的几何体,漫反射光产生了比环境光更为真实的光照效果。我们还可以使用镜面反射高光来达到更为真实的效果。

basic-lighting-i

镜面反射项

镜面反射项代表了从一个表面主要的反射方向附近被反射的光。镜面反射项在非常光滑和光泽的表面上是最显著的,例如被磨光的金属。

不像放射、环境反射和漫反射光照项,镜面反射的作用依赖于观察者的位置。如果观察者不在一个能够接收到反射光线的位置,观察者将不可能在表面上看到一个镜面反射强光。镜面反射项不仅受光源和材质的镜面反射颜色性质的影响,而且受表面的光泽度的影响。越有光泽的材质的高光区越小,而较少光泽的材质的高光区则分散的很开。用于镜面反射项的公式如下:
$$
specular = K_s \times lightColor \times facing \times (max(N \cdot H), 0)^{shininess}
$$
basic-lighting-b

其中:

  • $K_s$是材质的镜面反射颜色
  • $lightColor$是入射镜面反射光的颜色
  • $N$是规范化的表面法向量
  • $V$是指向视点的规范化向量
  • $L$是指向光源的规范化向量
  • $H$是$V$和$L$的中间向量的规范化向量
  • $P$是要被着色的点
  • $facing$是1,如果$N \cdot L$是大于0的,否则为0
  • $shininess$是材质的光泽度指数

使用$N$和$H$点积的幂确保了镜面反射外表当$H$和$V$分开的时候能够迅速减弱。另外,如果漫反射项为0的话,镜面反射项将被强制设为0。这确保镜面反射高光不出现在背向光源的几何表面上。

以下两张图片显示了材质颜色,为灰色,和光的颜色,为白色。

basic-lighting-j

得到的镜面反射高光如下所示。

basic-lighting-k

将镜面反射高光与前例产生的环境光和漫反射光结合起来,会得到以下图像。当所有三种类型的光一起使用时,渲染得到的球体明显看起来更像是真实物体。镜面反射光需要比漫反射光更多的计算量。镜面反射光一般用于以可见的方式提供有关表面材质的信息。镜面反射高光会随着表面材质的不同在大小和颜色上有所不同。

basic-lighting-l

距离衰减

通常,我们想要创建强度随距离减少的光源。这个性质被称为距离衰减。在任意给定点的衰减使用下面的公式进行模拟:
$$
attenuationFactor = \dfrac{1}{K_c + K_L d + K_Q d^2}
$$
其中:

  • $d$是到光源的距离
  • $K_c、K_L$和$K_Q$是控制衰减量的常量

整个公式从而变成:
$$
surfaceColor = emissive + ambient + (diffuse + specular) \times attenuationFactor
$$

点光源

场景中的点光源具有颜色和位置,但没有确定的方向。点光源向各个方向发出的光相等。点光源受衰减和范围的影响,并基于每个顶点对网格进行照明。在计算光照的过程中,使用点光源在世界坐标中的位置和当前顶点的坐标得到光的方向向量,以及光传播的距离。两者连同顶点法向一起,用于计算光在表面照明中所起的作用。

平行光

平行光只有颜色和方向,没有位置。平行光发出平行的光,这意味着所有平行光产生的光在场景中以相同的方向传播。可以认为平行光是位于无限远处的光源,如太阳。平行光不受衰减和范围的影响,因此应用程序指定的方向和颜色是计算顶点颜色时要考虑的唯二因子。因为照明因子的数量少,所以平行光是可用的计算量最小的光。

聚光灯

聚光灯具有颜色、位置和发出光的方向。聚光灯发出的光由一个比较亮的内圆锥和一个较大的外圆锥组成,光强由内而外逐渐减小。聚光灯受辐射(falloff)、衰减和范围的影响。这些因子同光到每个顶点的距离一起,参与计算场景中物体的光照效果。由于需要对每个顶点计算这些效果,因此这使得聚光灯成为所有类型的光源中最为耗时的。

basic-lighting-e

聚光灯的取舍角控制了聚光灯圆锥体的传播,只有在聚光灯圆锥体内的物体才能受到光照。为了创建聚光灯的圆锥体,需要知道聚光灯的位置、聚光灯的方向和将要进行着色点的位置。使用这些信息,就能够计算向量$V$(从聚光灯到顶点的向量)和向量$D$(聚光灯的方向)。

basic-lighting-c

通过计算这两个规范化向量的点积,可以得知P是否在聚光灯的圆锥体内。P只有当$dot(V, D)$大于聚光灯取舍角的余弦值时才受聚光灯的影响。

因为真实的聚光灯很少是均匀聚焦的,所以圆锥体可分为两部分:一个内部圆锥和一个外部圆锥。内部圆锥(热区)发出固定强度的光,而在内部圆锥以外强度平滑地逐渐减少。

basic-lighting-d

如果$P$在内部圆锥中,它将接受聚光灯的全部光强度。如果$P$在内部圆锥和外部圆锥之间,需要根据$P$离内部圆锥有多远来逐渐降低光强度。衰减函数如下:
$$
I_f = (\dfrac{cos\alpha - cos(\phi/2)}{cos(\theta/2)-cos(\phi/2)})^p
$$
其中:

  • $\alpha$为向量$D$和$V$的夹角
  • $\theta$为内部圆锥角度
  • $\phi$为外部圆锥角度
  • $p$为辐射值

参考:

1.https://msdn.microsoft.com/en-us/library/windows/desktop/bb174694(v=vs.85).aspx

2.http://www.cppblog.com/liangairan/articles/94103.html

3.http://www.cnblogs.com/QG-whz/p/5189831.html?utm_source=tuicool&utm_medium=referral#_label1_0