【D3D11游戏编程】学习笔记十二:光照模型

从这一篇开始,我们逐渐进入D3D11中有意思的部分。之前的场景绘制,要么为每个顶点指定单一的颜色,要么在线框模式下渲染。从现在起我们开始学习光照,这样场景就更加具有真实感了。 1. 法线的引入 1.1 顶点信息

在之前的绘图当中,每个顶点包含两个信息:位置坐标和颜色值。进入光照计算之后,我们不再需要顶点的颜色信息,而是新增了法线信息。即在光照模型中,一个顶点至少包含位置坐标和法线两种信息。给定一个顶点的坐标、法线、材质等信息,再通过光源进行计算而得出该顶点的颜色值。

1.2 法线的变换

在对一个顶点进行空间变换时,它的法线也需要相应地进行变换,因此我们需要得到一个顶点所对应的法线的变换矩阵。注意法线与顶点不共享相同的变换!如下为一个直观的例子:

三个图中,n为V0、V1顶点所在表面对应的法线。图a为变换前状态,图b为经过x轴方向的2倍伸缩变换(scaling)之后的状态,nA为经过同一个变换后的新法线。显然,这时法线与表面不垂直,因此是不正确的!正确的情形当该是图c所示。

实际上,对于一个顶点的坐标变换A,其对应的法线的正确变换是A的逆矩阵的转置,即。

2. 环境光、漫反射光与全反射光

在3D计算机图形学,对光照计算的处理分为三个部分:环境光、漫反射光和全反射光(或称为高光)。

2.1 环境光(Ambient light)

在现实当中,光照是一个很复杂的物理现象。一个物体所接受的光,除了直接来自光源的部分外,还包括光源经过环境中其他各个物体的反射而来的部分。而在图形学中,我们默认的光照模型为局部光模型,即一个顶点的光照计算只跟该点信息与光源信息有关,而不考虑环境中其他物体的影响,比如阴影等。与局部光照模型相对应的全局光照,这属于高级话题,这里暂时不考虑。为了近似地模拟现实当中来自周围环境的光,在图形学中引入的“环境光”这一概念,即“Ambient Light"。

环境光不需要进行特殊的物理计算,即直接将光源中的环境光部分与材质中的环境光部分相乘,其结果适用于物体上的任一顶点。

2.2 漫反射光(Diffuse light)

光照射在物体表面后,其反射光沿随机方向均匀的分布,即"漫反射”。反射光的强度与光照方向与表面法线的夹角theta相关,满足比例关系:I = Io * cos(theta)。由于反射光方向随机,因此该部分的计算与观察点无关,而只与光线方向与法线相关。

2.3 全反射光(Specular light)

光线照射在光滑物体表面后,在特定方向上会有很强的反射,即发生全反射。全反射光主要集中在一个近似圆锥角的范围内。如下图所示:

n为法线,l为光线入射方向,r为全反射方向,E为观察点,因此v为视角方向。全反射光进入眼睛的强度与v和r的角度theta有关,随着该角度增大,全反射强度下降,其下降辐度与物体表面光滑程序相关。因此,对于该部分光的计算,除了需要光线方向、法线等信息外,,还与观察点的位置有很大关系。具体计算公式在本文后面会详细给出。

3. 材质

为了表示物体与照射在其表面的光的交互作用,我们需要定义其材质。与光源的三个成分相对应,我们对材质了指定相应的环境光部分、漫反射光部分和全反射光部分,这些属性分别代表光的每一部分在其表面的反射比例。此外,还需要指定物体表面的光滑程度,以用于计算全反射。该值越大,全反射光衰减越迅速。

4. 三种光源模型

在学习光照计算前,需要先了解3D中常见的几种光源模型。主要分为三种,由简单到复杂分别为:平行光、点光源和聚光灯。

4.1 平行光

平行光是最简单的一种模型,这种光照具有单一的照射方向,且光照强度不随空间位置而变化。现实当中的太阳光就可以认为是这种类型。

4.2 点光源

一个具有点光源特性的典型例子是电灯泡。首先该光源在空间具有一个位置,其次它发出的光以球面形式向四周均匀的传播(尽管实际的电灯光在各个方向上并不均匀,我们此外姑且可以这样理解。)。还有一个重要的特性即光强随着与光源的距离的增大而逐渐减小。理论上光强与距离的平方成反比,即I(d) = I0/(d)。因此在无穷远处光强接近为0;在光源所在处,光强为无穷大。这样显然不适合在计算机中进行处理。于是在3D图形学中,我们对点光源模型有如下定义:用三个系数A0、A1、A2来控制光强随距离的衰减,分别为常量系数、一次系数和二次系数,这样光强计算公式为:I = I0/(A0+A1*d+A2*d)。其次,对光照范围有一个限制,超过特定范围后,光照强度定义为0。

4.3 聚光灯最好的感觉就是你什么都跟我说。

【D3D11游戏编程】学习笔记十二:光照模型

相关文章:

你感兴趣的文章:

标签云: