D3D9 Sample(4)—Lights
打开Tutorial 4: Lights项目,编译后运行,界面如下:
我们看到一个旋转的圆管形,这个例子主要演示光照计算。绘制的每一帧都会设置光照和材质,类似上一个Sample设置矩阵,在固定管道中,只需填充一个数据结构,然后把结构传给D3D9,固定渲染管道会根据设置自动进行光照运算。如果使用了Shader,则下面的SetMaterial和SetLight都会失效,需要自己在Shader代码中进行光照计算。
1. 创建模型
首先是建立一个几何体。我们看顶点的数据结构有所变化:
struct CUSTOMVERTEX
{
D3DXVECTOR3 position; // The 3D position for the vertex
D3DXVECTOR3 normal; // The surface normal for the vertex
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)
定义了一个位置信息和法线信息,顶点不再需要颜色值,它的颜色由材质Material来管理。法线用于计算光照在顶点上产生的颜色值影响,从而模拟光照效果。
2. 设置材质
typedef struct _D3DMATERIAL9 {
D3DCOLORVALUE Diffuse; /* Diffuse color RGBA */
D3DCOLORVALUE Ambient; /* Ambient color RGB */
D3DCOLORVALUE Specular; /* Specular 'shininess' */
D3DCOLORVALUE Emissive; /* Emissive color RGB */
float Power; /* Sharpness if specular highlight */
} D3DMATERIAL9;
物体材质的一种配置结构。
打开3ds Max可以直观的看到,第二、三个材质球明暗渐变的颜色称为漫反射色(Diffuse)。第一个材质球两个原点(几乎白色)的颜色就是镜面反射色Specular。而环境光色(Ambient)是为了场景有一定的亮度而设置的简单颜色,如果没有环境光,那么没有上述两种光照的点都是漆黑一片。自发光(Emissive)是为了模拟现实中很多自发光物体,如LED霓虹灯,它只是有自发光效果,并不照亮别的物体。
IDirect3DDevice9::SetMaterial
将材质的配置告知D3D9。
3. 设置光照
typedef struct _D3DLIGHT9 {
D3DLIGHTTYPE Type; /* Type of light source */
D3DCOLORVALUE Diffuse; /* Diffuse color of light */
D3DCOLORVALUE Specular; /* Specular color of light */
D3DCOLORVALUE Ambient; /* Ambient color of light */
D3DVECTOR Position; /* Position in world space */
D3DVECTOR Direction; /* Direction in world space */
float Range; /* Cutoff range */
float Falloff; /* Falloff */
float Attenuation0; /* Constant attenuation */
float Attenuation1; /* Linear attenuation */
float Attenuation2; /* Quadratic attenuation */
float Theta; /* Inner angle of spotlight cone */
float Phi; /* Outer angle of spotlight cone */
} D3DLIGHT9;
光照的配置结构。灯光大致分成电光源(Point Light)、平行光(Directional Light)和聚光灯(SpotLight)三种。
IDirect3DDevice9::SetLight
将灯光的配置告知D3D9。
g_pd3dDevice->LightEnable( 0, TRUE );
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
后面还得让固定渲染管道开启光照运算。
参考资料
http://msdn.microsoft.com/en-us/library/windows/desktop/bb174694(v=vs.85).aspx