光照有助于描述实体形状和立体感。使用光照时,无需指定顶点的颜色值,D3D光照引擎会依据光源类型、材质和物体表面相对于光源的朝向,计算出每个顶点的颜色值。
1.光照类型
环境光、漫射光、镜面光。默认状态下,D3D不进行镜面反射计算,可通过Device->SetRenderState(D3DRS_SPECULARENABLE,true);启用。
2.材质
材质允许我们定义物体表面对各种颜色光的反射比例。通过如下结构体定义:
typedef struct D3DMATERIAL9 {
D3DCOLORVALUE Diffuse;
D3DCOLORVALUE Ambient;
D3DCOLORVALUE Specular;
D3DCOLORVALUE Emissive;
float Power;
} D3DMATERIAL9, *LPD3DMATERIAL9;
可以通过控制材质在各种类型光照下,哪种颜色的光将被反射。
3.法线
面法线是描述多边形朝向的向量。
顶点法线正是基于面法线的思路而产生的,顶点法线描述的是构成多边形的各个顶点的法线。D3D需要知道顶点的法线才能进行正确的光照计算。如果有多个三角面共享一个顶点,一般取这些三角面法线的平均值为顶点的法线。在变换过程中顶点的法线向量可能不再规范化,在最终渲染之前通过Device->SetRenderState(D3DRS_NORMALIZENORMALS,true);即可使法向量重新规范化。
4.光源
注意和光照概念的区别。D3D支持三种类型的光源:点光源、方向光和聚光灯。可通过如下结构体定义:
typedef struct D3DLIGHT9 {
D3DLIGHTTYPE Type;
D3DCOLORVALUE Diffuse;
D3DCOLORVALUE Specular;
D3DCOLORVALUE Ambient;
D3DVECTOR Position;
D3DVECTOR Direction;
float Range;
float Falloff;
float Attenuation0;
float Attenuation1;
float Attenuation2;
float Theta;
float Phi;
} D3DLIGHT9, *LPD3DLIGHT;
在D3DLIGHT9初始化之后,需要对使用的光源进行设置和开关控制,如下:
Device->SetLight(0, &point);
Device->LightEnable(0, true);
5.添加光照步骤
a.为物体(含法线)创建材质,并在绘制对应物体前设置该材质;
b.创建,设置和启用光源;
c.启用其余光照状态;
d.启用光照。