一、概述
为了增强所绘制场景的真实感,我们可以为场景增加光照。光照也有助于描述实体形状和立体感。使用光照时,我们无需自行指定顶点的颜色值:Direct3D会将顶点送入光照计算引擎,依据光源类型、材质以及物体表面相对于光源的朝向,计算出每个顶点的颜色值。基于某种光照模型计算出各顶点的颜色,会使绘制结果更加逼真。
二、光照的组成
在Direct3D的光照模型中,光源发出的光由以下3个分量或3种类型的光组成。
●环境光(Ambient Light)这种类型的光经其他表面反射到达物体表面,并照亮整个场景。物体之所以会被照亮,是由于其他物体对光的反射。要想以较低代价粗略地模拟这类反射光,环境光是一个很好的选择。
●漫射光(Diffuse Light)这种类型的光沿着特定的方向传播。当它到达某一表面时,将沿着各个方向均匀反射。由于漫射光沿所有点的方向均匀反射,无论从哪个方位观察,表面亮度均相同,所以采用该模型时,无需考虑观察者的位置。
●镜面光(Specular Light)这种类型的光沿特定的方向传播。当此类光到达一个表面时,将严格地沿着另一个方向反射,从而形成只能在一定角度范围内才能观察到的高亮度照射。镜面光与其他类型的光相比,计算量要大很多。默认状态下,Direct3D不进行镜面反射计算:如果想启用镜面光,必须将绘制状态D3DRS_SPECULARENABLE设为TRUE。
每种类型的光都可用结构D3DCOLORVALUE或D3DXCOLOR来表示,这些类型描述了光线的颜色。描述光线颜色时,D3DXCOLOR类中的Alpha值都将被忽略。
三、材质
在显示世界中,我们所观察到的物体的颜色是由该物体所反射的光的颜色决定的。例如一个纯红色的球体反射了全部的红色入射光,并吸收了所有非红色的光,所以该球体呈现为红色。Direct3D通过定义物体的材质来模拟同样的现象。材质允许我们定义物体表面对各种颜色光的反射比例。
材质的定义如下:
typedef struct D3DMATERIAL9{
D3DCOLORVALUE Diffuse;
D3DCOLORVALUE Ambient;
D3DCOLORVALUE Specular;
D3DCOLORVALUE Emissive;
float Power;
}D3DMATERIAL9, *LPD3DMATERIAL9;
●Diffuse 指定材质对漫射光的反射率。
●Ambient 指定材质对环境光的反射率。
●Specular 指定材质对镜面光的反射率。
●Emissive 该分量用于增强物体的亮度,使之看起来好像可以自己发光。
●Power 指定镜面高光点的锐度,该值越大,高光点的锐度越大。
顶点结构中不含有材质属性,但我们必须对当前材质进行设定。
如下函数用来对当前材质进行设定: