D3D9 Samples(4)--Lights

来源:互联网 发布:微博个性域名二次更改 编辑:程序博客网 时间:2024/05/16 17:42

 

 

 

D3D9 Sample(4)—Lights

 

 

        打开Tutorial 4: Lights项目,编译后运行,界面如下:

 

 

       我们看到一个旋转的圆管形,这个例子主要演示光照计算。绘制的每一帧都会设置光照和材质,类似上一个Sample设置矩阵,在固定管道中,只需填充一个数据结构,然后把结构传给D3D9,固定渲染管道会根据设置自动进行光照运算。如果使用了Shader,则下面的SetMaterialSetLight都会失效,需要自己在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