在DirectX中使用灯光是一件比较方便的事情,(比OpenGL中方便多了...)大体可分为一下几步:
1,设置场景中物体的几何关系:主要就是定义好物体的坐标和法线等量...
struct CUSTOMVERTEX
{
D3DXVECTOR3 position; // The 3D position for the vertex.
D3DXVECTOR3 normal; // The surface normal for the vertex.
};
// Custom flexible vertex format (FVF).
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)
以上是最简单的一种使用用户自定义顶点格式来处理灯光的方法.之后在是为场景中点分别赋值,确定正确的法线方向.然后就是简单的将这些定点数据Copy到定点缓冲区去.
2.设置材质
材质就是物体受到光的照射后应该反色的颜色,一个简单的设置过程是:
D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(mtrl) );
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;//定义一个材质的颜色
g_pd3dDevice->SetMaterial( &mtrl );设置当前将要使用的材质.如果步设置材质,物体就没有反射光,也就应该是黑色
3.显示的启动灯光.
D3DXVECTOR3 vecDir;
D3DLight9 light;
ZeroMemory( &light, sizeof(light) );
light.Type = D3DLIGHT_DIRECTIONAL;//光的种类,一共有D3DLIGHT_POINT,D3DLIGHT_SPOT ,D3DLIGHT_DIRECTIONAL 可供选用
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;//设置灯光的颜色
light.Range = 1000.0f;//光能照到的范围
g_pd3dDevice->SetLight( 0, &light ); //设置这个灯光,它的编号是0
g_pd3dDevice->LightEnable( 0, TRUE );//启动这个灯源,如果为FALSE则禁用这个灯源
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );//从宏观上启动灯光的炫染
最终显示的物体颜色应该是材质和灯光共同作用的结果