D3D9 Samples(4)--Lights
2013-09-10 11:53
260 查看
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
相关文章推荐
- D3D9 Samples(9)--BasicHLSL
- D3D9 Samples(10)--Text3D
- D3D9 Samples(11)--HLSLwithoutEffects
- D3D9 Samples(12)--CompiledEffect
- D3D9 Samples(1)--CreateDevice
- D3D9 Samples(14)--StateManager
- D3D9 Samples(2)--Vertices
- D3D9 Samples(15)--CustomUI
- D3D9 Samples(3)--Matrices
- D3D9 Samples(16)--Pick
- D3D9 Samples(5)--Textures
- D3D9 Samples(6)--Meshes
- D3D9 Samples(7)--EmptyProject
- D3D9 Samples(8)--SimpleSample
- 上周技术关注:101 Samples for Visual Studio 2005
- Infragistics NetAdvantage Samples 在.net 2.0和1.x共存的环境下不能运行时,采取的办法
- 【来自KEVIN HOYT】【代码下载】【强烈推荐】Samples Updated for AIR Beta 3 | Kevin Hoyt
- XML Serialization Samples in .NET
- OGRE教程(二):Cameras, Lights, and Shadows
- SQL Server Samples : SQL Server 2008 Samples