为了增强所绘制的场景的真实感,我们会为场景增加光照,使用光照来描物体的立体感。使用光照的时候,我们就无需描述顶点的颜色,Direct3D会将顶点送入光照计算引擎,然后引擎根据光源类型,材质以及物体表面和相对于光源的朝向等等,计算出内个顶点的颜色值。基于某种光照模型然后计算出顶点的颜色,效果更nice。
光照的组成
环境光
这种类型的光经过其他物体表面反射到达所观察物体,并且照亮场景。比如:某一个物体的一部分被照亮,但是该物体并没有处在光源的直接照射下,之所以被照亮,是因为有其他物体反射光源的光,然后到达自己身上,再被照亮的。这类光叫做环境光。
漫射光
这种类型的光沿着特定的方向传播。当漫射光到达一定表面的时候,沿着物体表面的所有方向均匀反射,所以无论从哪一个方向观察,表面的亮度都是相同的,所以采用漫射光的模型的时候,不需要考虑观察者的位置。所以漫射光方程中只需要考虑光的传播方向以及表面的朝向。从一个光源发出的光,大多就是这种类型的光。
镜面光
这类光沿着特定的方向传播,当光线到达表面之后,然后严格的按照另外一个方向进行,从而形成只能在一定角度才能观察到的高亮度照射,所以在镜面光方程中我们不仅要光照的入射方向和物体的表面朝向,还要考虑观察者的方向,镜面光可以模拟物体中的高光点,例如:当光线照射到物体表面所形成的的比较亮的照射
镜面光的计算量比环境光和漫射光的计算量要大得多,所以Direct3D专门为其设置了开关选项,默认情况下,Direct3D是不计算镜面光的反射的。
使用状态机将有关状态设置为true,就会将镜面光照打开:
Device->SetRenderState(D3DRS_SOECULARENABLE,true);
材质
在现实世界中,物体的颜色是由其反射的光的颜色决定的。一个物体反射所有的红色光,吸收所有的非红色光,那么这个物体就呈现于红色光。Direct3D中允许我们通过定义物体的材质来模拟同样的现象。材质允许我们定义物体的表面对各种光的反射比例,在代码中使用D3DMATERIAL9来表示:
typedef struct D3DMATERIAL9
{
D3DCOLORVALUE Diffuse; //指定材质对漫射光的反射率
D3DCOLORVALUE Ambient; //指定材质对环境光的反射率
D3DCOLORVALUE Specular; //指定材质对镜面光的反射率
D3DCOLORVALUE Emissive; //该分量用于增强物体的亮度,使之看起来可以自己发光
float Power; //指定镜面高光的锐度,该值越大,高光点的锐度越大
}D3DMATERIAL9,*LPD3DMATERIAL9;
假如现在有一个红色的球体,我们想让他只去反射红色的光,应该向下面这样定义:
D3DMATERIAL9 red;
::ZeroMemory(&red, sizeof(red));
red.Diffuse =