《清华大学DirectX游戏编程第6章(全20章).ppt》由会员分享,可在线阅读,更多相关《清华大学DirectX游戏编程第6章(全20章).ppt(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第6章 光照 主要目标:学习Direct3D提供的光源以及这些光源所发出的光的类型。掌握定义光源的方法,以及光源如何作用于受光照影响的物体表面。学习如何使用数学方法来描述三角形表面的方向,然后可以用于决定光线以哪种角度作用于三角形上。26.1 光 的 组 成在在Direct3D的光照模型中,由光源发出的光主的光照模型中,由光源发出的光主要有要有3种类型:种类型:环境光(Ambient Light)该类型的光将会被多个表面反射,常用于照亮整个场景。散射光(Diffuse Light)该类型的光沿着特定方向传播。镜面光(Specular Light)该类型的光也沿着特定的方向传播,当遇到物体表面时
2、将沿着特定的方向进行反射,这样在一定的角度上就可以看到一个高亮区域。36.1 光 的 组 成镜面光比其他两种类型的光需要更多的计算,因此,镜面光比其他两种类型的光需要更多的计算,因此,在在Direct3D中提供关闭镜面光的功能。实际上,在默中提供关闭镜面光的功能。实际上,在默认状态下,镜面光是关闭的,要使镜面光起作用,需认状态下,镜面光是关闭的,要使镜面光起作用,需要设置要设置D3DRS_SPECULARENABLE渲染状态:渲染状态:Device-SetRenderState(D3DRS_SPECULARENABLE,true);每种类型的光都可以使用每种类型的光都可以使用D3DCOLORV
3、ALUE结构或结构或D3DXCOLOR来描述光的颜色,例如:来描述光的颜色,例如:D3DXCOLOR redAmbient(1.0f,0.0f,0.0f,1.0f);D3DXCOLOR blueDiffuse(0.0f,0.0f,1.0f,1.0f);D3DXCOLOR whiteSpecular(1.0f,1.0f,1.0f,1.0f);46.2 材 质材质被定义为物体表面对光的反射百分比。材质被定义为物体表面对光的反射百分比。在代码中,材质使用在代码中,材质使用D3DMATERIAL9结构来结构来表示:表示:typedef struct _D3DMATERIAL9 D3DCOLORVALU
4、E Diffuse,Ambient,Specular,Emissive;float Power;D3DMATERIAL9;56.2 材 质观察下面的示例,假设想得到红球。那么定义球的材观察下面的示例,假设想得到红球。那么定义球的材质只能反射红光,其他颜色的光应该被吸收:质只能反射红光,其他颜色的光应该被吸收:D3DMATERIAL9 red;:ZeroMemory(&red,sizeof(red);red.Diffuse=D3DXCOLOR(1.0f,0.0f,0.0f,1.0f);/redred.Ambient=D3DXCOLOR(1.0f,0.0f,0.0f,1.0f);/redred.S
5、pecular=D3DXCOLOR(1.0f,0.0f,0.0f,1.0f);/redred.Emissive=D3DXCOLOR(0.0f,0.0f,0.0f,1.0f);/no emissionred.Power=5.0f;自己手动去设置材质结构是件烦人的事情,因此在自己手动去设置材质结构是件烦人的事情,因此在d3dutility.h/cpp中定义了以下的实用函数和全局材质:中定义了以下的实用函数和全局材质:参见教材P9766.2 材 质IDirect3DDevice9:SetMaterial(CONST D3DMATERIAL9*pMaterial)函数用于指定当函数用于指定当前材质。前
6、材质。使用不同的材质来渲染物体的程序如下:使用不同的材质来渲染物体的程序如下:D3DMATERIAL9 blueMaterial,redMaterial;./set up material structuresDevice-SetMaterial(&blueMaterial);drawSphere();/blue sphereDevice-SetMaterial(&redMaterial);drawSphere();/red sphere76.3 顶 点 法 线平面法线是用于描述多边形朝向的向量平面法线是用于描述多边形朝向的向量(见图见图6.1)。顶点法线和平面法线类似,但是不同之处在顶点法线
7、和平面法线类似,但是不同之处在于每一个多边形只有一个平面法线,而多边形于每一个多边形只有一个平面法线,而多边形的每个顶点都拥有一个顶点法线,如图的每个顶点都拥有一个顶点法线,如图6.2所示。所示。86.3 顶 点 法 线注意顶点法线不一定和平面法线相同。球或者圆就是注意顶点法线不一定和平面法线相同。球或者圆就是一个很好的例子,在这两个物体上顶点法线和所在三一个很好的例子,在这两个物体上顶点法线和所在三角形的法线不相同角形的法线不相同(见图见图6.3)。要使顶点可以描述法线,必须更改顶点结构:要使顶点可以描述法线,必须更改顶点结构:struct Vertex float _x,_y,_z;flo
8、at _nx,_ny,_nz;static const DWORD FVF;const DWORD Vertex:FVF=D3DFVF_XYZ|D3DFVF_NORMAL;96.3 顶 点 法 线下面是一个下面是一个C函数,用于通过三角形的三个顶点来计函数,用于通过三角形的三个顶点来计算平面法线:算平面法线:void ComputeNormal(D3DXVECTOR3*p0,D3DXVECTOR3*p1,D3DXVECTOR3*p2,D3DXVECTOR3*out)D3DXVECTOR3 u=*p1-*p0;D3DXVECTOR3 v=*p2-*p0;D3DXVec3Cross(out,&u,
9、&v);D3DXVec3Normalize(out,out);106.4 光 源Direct3D支持三类光源。支持三类光源。(1)点光源。光源处于世界空间中,并且向各个方向发射光线,如图6.4所示。(2)平行光。这种光源没有固定的位置,但却是在一个特定的方向上射出平行的光线,如图6.5所示。116.4 光 源(3)聚光灯光源。该光源有点像手电筒,它有位置,光线沿着一个方向成圆锥形散发。这个锥体的形状通过用角度(Theta)和(phi)进行描述。角用来描述内部锥体的张角,用来描述外部锥体的张角,如图6.6所示。126.4 光 源在程序中光源通过在程序中光源通过D3DLIGHT9结构进行描述:结构
10、进行描述: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;136.4 光 源在在d3dUtility.h/cpp文件中
11、添加下面的函数来初始化文件中添加下面的函数来初始化简单光源:简单光源:namespace d3d.D3DLIGHT9 InitDirectionalLight(D3DXVECTOR3*direction,D3DXCOLOR*color);D3DLIGHT9 InitPointLight(D3DXVECTOR3*position,D3DXCOLOR*color);D3DLIGHT9 InitSpotLight(D3DXVECTOR3*position,D3DXVECTOR3*direction,D3DXCOLOR*color);146.4 光 源初始化初始化D3DLIGHT9对象之后,还需要在对
12、象之后,还需要在Direct3D管理的内部光源列表中注册该光源,管理的内部光源列表中注册该光源,程序如下:程序如下:Device-SetLight(0,/在光源列表中的元素,范围是 0maxlights&light);/D3DLIGHT9结构的地址注册完后,我们可以用下面的方法来开启或关注册完后,我们可以用下面的方法来开启或关闭它:闭它:Device-LightEnable(0,/要开关的元素 true);/true表示打开,false表示关闭156.5 示例:光照本章的示例中创建了图本章的示例中创建了图6.7中展示的中展示的场景,主要示范如何指定顶点法线、场景,主要示范如何指定顶点法线、如何
13、创建材质、如何创建和激活一如何创建材质、如何创建和激活一个平行光源。个平行光源。给场景加光照效果的步骤如下。给场景加光照效果的步骤如下。(1)激活光照模型。(2)为每个物体创建材质,并且在渲染之前设置相应的材质。(3)创建一个或者多个光源,设置光源并打开光源。(4)打开其他的光照状态,比如镜面高光。166.5 示例:光照例如,所有的三角形都共享了顶点例如,所有的三角形都共享了顶点(0,1,0),然而对于每个三角形来说这个点的法线的方向然而对于每个三角形来说这个点的法线的方向都是不同的。代码如下:都是不同的。代码如下:参见教材P105在该例子中,金字塔反射白光,自身不发光,在该例子中,金字塔反射
14、白光,自身不发光,同时带有一些高光。代码如下:同时带有一些高光。代码如下:参见教材P106接下去将创建并打开一个平行光源接下去将创建并打开一个平行光源。176.5 示例:光照代码如下:代码如下:D3DLIGHT9 dir;:ZeroMemory(&dir,sizeof(dir);dir.Type=D3DLIGHT_DIRECTIONAL;dir.Diffuse=d3d:WHITE;dir.Specular=d3d:WHITE*0.3f;dir.Ambient=d3d:WHITE*0.6f;dir.Direction=D3DXVECTOR3(1.0f,0.0f,0.0f);Device-SetL
15、ight(0,&dir);Device-LightEnable(0,true);最后,设置渲染状态重新计算法线方向,并打开镜面光:最后,设置渲染状态重新计算法线方向,并打开镜面光:Device-SetRenderState(D3DRS_NORMALIZENORMALS,true);Device-SetRenderState(D3DRS_SPECULARENABLE,true);/.省略了设置视图和投影矩阵return true;186.6 其 他 例 子图图6.8是平行光例子的屏幕截图。是平行光例子的屏幕截图。196.7 小 结Direct3D支持三种类型的光源模型支持三种类型的光源模型平行光平行光源、点光源和聚光灯光源。光源发出三种类型源、点光源和聚光灯光源。光源发出三种类型的光的光环境光、散射光和镜面光。环境光、散射光和镜面光。材质定义光和物体表面之间的关系。材质定义光和物体表面之间的关系。顶点法线用于定义顶点的方位。顶点法线用于定义顶点的方位。Direct3D根据根据顶点法线来决定光线照射到顶点的角度。在一顶点法线来决定光线照射到顶点的角度。在一些情况下,可以认为顶点法线和由顶点构成的些情况下,可以认为顶点法线和由顶点构成的三角形的平面法线相同,但是在需要模拟光滑三角形的平面法线相同,但是在需要模拟光滑表面的物体中这种方法并不常用。表面的物体中这种方法并不常用。20