还剩15页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
《游戏设计》课程设计指导书编写蔺广逢适用于数字媒体专业
2011.12游戏设计课程设计任务书设计时间1周学分数
1.0执笔人范彩霞编写日期2008年10月
一、课程设计目的游戏设计课程设计是数字媒体技术专业必修的实践环节本课程设计是《游戏设计》课程实践环节的深化和延续通过该实践环节的训练,使学生能够更加全面和系统的掌握游戏设计的体系结构通过对所做游戏的故事梗概、游戏类型以及设计制作过程中所涉及的相关技术的学习和掌握,提高学生的实践能力以及团队协作能力,为在计算机游戏设计这一领域进行深入研究做准备
二、课程设计的内容与要求本课程设计通过分组来进行,每组3~4人对每一个组,都必须设计和实现一个完整的游戏,游戏的类型不限,软件运行环境限为MicrosoftWindows,硬件平台限为PC在每组进行游戏设计之前必须提供游戏文档说明,包括游戏的故事情节、游戏的类型、游戏界面的设计等每组设计的游戏不一定是原创的,但绝不能抄袭已有的游戏每组设计的游戏需要有较为完整的情节,要求能体现以下的基本技术提供使用键盘或鼠标控制视点的朝向和运动的功能;在游戏中至少有一个人物是三维的,并且能产生相应的动画必须在某个场景中有配音或者背景音乐;最好能在某一个画面中体现一些特效技术;必须能实时或者准实时运行游戏设计完成后对自己所做的游戏进行短评,包括游戏中的哪一部分是最得意的?对最初的游戏设计作了哪些修改,___?在这个游戏项目的实践中获得的经验和教训是什么?如果有更多的时间下一步会怎么做?
三、课程设计的报告(论文、作业)的要求课程设计报告是课程设计过程的整理和总结因此,编写课程设计报告是课程设计阶段的一个重要组成部分课程设计报告的内容和要求根据设计内容而定,对于本课程设计,主要应包括以下内容封面封面上应标明“游戏设计课程设计”报告、专业、姓名、学号与时间等;课程设计报告内容主要包括
(1)课程设计的目的;
(2)课程设计的内容主要包括游戏的故事摘要;游戏的类型;各成员的分工;制作工具;流程图以及如何玩这个游戏重点写明设计思想,制作步骤、制作过程中出现的问题、解决方案等;
(3)总结总结成功之处与问题所在,自己通过本次课程设计有什么收获和感悟
四、课程设计考核与成绩评定根据学生的实验准备、操作能力、实验结果、实验报告质量、实验纪律等综合评定实验成绩
(1)总分100分其中考勤10分,作品50分,课程设计报告40分;
(2)考勤每天上、下午1次,每次2分;
(3)如发现有严重抄袭者,个人成绩以零分计;
(4)课程设计报告以准确、规范、认真等指标进行打分,不得抄袭,否则总成绩按零分计
五、课程设计纪律及注意事项
(1)每位参加课程设计的同学必须认真对待,积极参加;
(2)从严要求自己,不随意迟到、早退和旷课,有事需例行请假手续,实验室内不得玩计算机游戏;
(3)在课程设计中应积极发挥个人主观能动性,勤于思考,虚心向指导教师、实验室教师请教,服从实验室教师的安排;
(4)爱护实验室的所有财产,不得私自删除机器上系统文件;
(5)保持实验室的整洁卫生凡违反课程设计纪律者,指导教师或实验室教师有权进行批评教育或终止其课程设计,成绩以零分记DirectX初级教程TOC\o1-3\h\z\u
1.__环境
32.3D基本概念
32.1几种颜色的变量类型及其相关函数应注意区分
32.2材质
42.3向量
42.4光源
42.5摄像机(camera)
43.创建D3D设备
53.1Direct3DCreate
953.2CreateDevi__
53.3基本变量
53.4其他要调用的函数及变量(调用次数较少)
54.基本渲染顶点
64.1 定义顶点格式和FVF;
64.2创建顶点缓冲区并填充之;
64.3D3D进行渲染;
75.使用顶点索引缓冲区
85.1创建顶点索引缓冲区并填充之
85.2将顶点索引缓冲区设置到渲染管道流水线
96.摄像机
106.1D3D中使用的几种常用的向量
106.2D3D相机中使用的几种常用的关于向量的函数
106.3点和向量的区别
116.3Camera相机矩阵计算问题
117.基本纹理应用
127.1纹理尺寸
127.2纹理坐标
127.3基本纹理添加步骤以及所使用的函数
128.模型加载
141.装载模型
142.填充纹理和材质
143.渲染
141.__环境注意,一定要把新加的SDK路径__到目录列表的最上方,因为VC是按顺序搜索路径的最基本的DX定义规范I开头的是接口;D3D开头的一般是定义的一些结构;D3DX是封装了操作的扩展结构;
2.3D基本概念
2.1几种颜色的变量类型及其相关函数应注意区分D3DCOLOR、D3DXCOLOR、D3DCOLORVALUE注意
1.D3DCOLOR属于DWORD型的变量,其定义包含在d3d9types.__件中;
2.D3DXCOLOR属于结构体类型,其定义包含在d3dx9__th.h中typedefstructD3DXCOLOR {FLOAT r;FLOAT g;FLOAT b;FLOAT a;}D3DXCOLOR;//rgba的范围在
0.0f-
255.0f之间
3.D3DCOLORVALUE同属于结构体类型,其定义包含在d3d9types.__件中typedefstruct_D3DCOLORVALUE {float r;float g;float b;float a;}D3DCOLORVALUE;//rgba的范围在
0.0f-
1.0f之间与各个变量相对应的函数或宏也包含在与变量相对应的头文件中(带有x的变量其对应头文件也包含x,方便记忆)下边介绍相关函数及宏
1.与D3DCOLOR相对应的宏有以下4个
1.#defineD3DCOLOR_ARGBargb\D3DCOLORa0xff24|r0xff16|g0xff8|b0xff
2.#defineD3DCOLOR_RGBArgbaD3DCOLOR_ARGBargb
3.#defineD3DCOLOR_XRGBrgbD3DCOLOR_ARGB0xffrgb其中该宏的Alpha值定义为255,完全不透明
4.#defineD3DCOLOR_COLORVALUErgba\D3DCOLOR_RGBADWORDr*
255.fDWORDg*
255.fDWORDb*
255.f\DWORDa*
255.f
2.2材质材质的定义是材质typedefstruct_D3D__TERIAL9 {D3DCOLORVALUEDiffuse;//漫反射光 D3DCOLORVALUEAmbient;//环境光,理解为整体亮度 D3DCOLORVALUESpecular;//镜面反射,一般用于光滑的平面 D3DCOLORVALUEEmissive;//放射光,一般用于自发光体(太阳、灯…)对于材质设置,自发光不应太强 floatPower;//指定镜面高光的强度}D3D__TERIAL9;
2.3向量typedefstruct_D3DVECTOR {float xyz;}D3DVECTOR;该定义包含在d3d9types.h头文件中
2.4光源typedefstruct_D3DLIGHT9 {D3DLIGHTTYPE Type;//光源类型,有点光源、聚焦光源、方向光源3种D3DCOLORVALUE Diffuse;//漫反射光颜色D3DCOLORVALUESpecular;//镜面反射光颜色D3DCOLORVALUEAmbient;//环境光颜色D3DVECTORPosition;//光源位置(对方向光源无效,如果创建方向光源可忽略)D3DVECTORDirection;//方向(对点光源无效,如果创建点光源无效可忽略可以是非单位向量,但是不能是0向量)floatRange;//光的范围,就是能照多远(对方向光无效,如果创建方向光源可忽略)floatFalloff;//聚光内外光圈的径向强度衰减,一般为
1.0f只针对聚焦光源floatAttenuation0;//距离衰减0(创建方向光源可忽略,非方向光源一般3个距离衰减均取取
0.0f)floatAttenuation1;//距离衰减1(创建方向光源可忽略,非方向光源一般3个距离衰减均取取
0.0f)floatAttenuation2;//距离衰减2(创建方向光源可忽略,非方向光源一般3个距离衰减均取取
0.0f)floatTheta;//指定聚光内圈的夹角大小(0-Phi)只针对聚焦光源 floatPhi;//指定聚光外圈的夹角大小(0-pi)(只针对聚焦光源)}D3DLIGHT9;注
1.这里非方向光源指点光源和聚焦光源
2.添加光照并开启光照,而且必须为模型或面添加了法向量及材质,光源才起作用即光照三要素光照、材质、法向量
2.5摄像机(camera)摄像机的确定有两个主要参数一个位置和一个方向将摄像机设置到场景中要用到SetTransformD3DTS_VIEWm___tView;//m___tView就是摄象机的观察矩阵
3.创建D3D设备所需的主要的2个函数和3个变量(其余函数根据所需变量的填充要求而定)
3.1Direct3DCreate9其原型为IDirect3D9 *Direct3DCreate9 UINT SDKVersion;SDKVersion为SDK版本值,函数及SDKVersion的定义包含在d3d
9.h中,编译过程中需要d3d
9.lib链接库
3.2CreateDevi__HRESULT CreateDevi__UINT Adapter D3DDEVTYPE Devi__TypeHWND hFocusWindow DWORD Beh__iorFlags D3DPRESENT_PARAMETERS *pPresentationParameters IDirect3DDevi__9** ppReturnedDevi__Inte_____;参数解释UINT Adapter一般使用D3DADAPTER_DEFAULT代表主适配器(即显示器);D3DDEVTYPE Devi__TypeD3DDEVTYPE_HAL代表使用硬件加速方式,D3DDEVTYPE_REF代表使用软件仿真方式;HWND hFocusWindow代表要创建D3D设备的窗口的句柄 DWORD Beh__iorFlags处理标识最常用的选项有D3DCREATE_HARDWARE_VERTEXPRO__SSING硬件处理D3DCREATE_SOFTWARE_VERTEXPRO__SSING软件处理D3DCREATE_MIXED_VERTEXPRO__SSING软硬件结合处理D3DPRESENT_PARAMETERS *pPresentationParameters描述设备显示参数的结构体,一般要调用其他函数来填充该结构体;IDirect3DDevi__9** ppReturnedDevi__Inte_____用于返回D3D的设备对象指针
3.3基本变量D3DCAPS
9、D3DDISPLAYMODE、D3DPRESENT_PARAMETERS三个比较基本的变量,用于描述显示设备创建时的相关参数
3.4其他要调用的函数及变量(调用次数较少)HRESULT GetDevi__Caps UINT Adapter D3DDEVTYPE Devi__Type D3DCAPS9 *pCaps;HRESULT GetAdapterDisplayMode UINT Adapter D3DDISPLAYMODE *pMode;UINT GetAdapterCountVOID;
4.基本渲染顶点渲染的基本步骤是这样的
4.1 定义顶点格式和FVF;顶点格式必须与FVF中定义的一致,这样流水线才能识别如structCUSTOMVERTEX { FLOATxyz;//顶点坐标 DWORDcolor;//顶点颜色 };与之相对应的FVF为蓝色部分#defineD3DFVF_CUSTOMVERTEXD3DFVF_XYZ|D3DFVF_DIFFUSE
4.2创建顶点缓冲区并填充之;使用的基本函数有
1.CreateVertexBuffer();HRESULT CreateVertexBuffer UINT Length DWORD Usage DWORD FVF D3DPOOL Pool IDirect3DVertexBuffer9** ppVertexBuffer HANDLE* pHandle;UINT Length用来指定顶点缓冲区的大小;DWORD Usage一般设置为0;DWORD FVF自定义可变顶点格式;D3DPOOL Pool可用D3DPOOL _DEFAULT=0 (一般用这个比较多)D3DPOOL___NAGED=1 D3DPOOL_SYSTEMMEM=2 D3DPOOL_SCRATCH=3IDirect3DVertexBuffer9** ppVertexBuffer指向顶点缓冲区COM对象的指针HANDLE* pHandle一般设置为NULL
2.Lock()HRESULT Lock UINT OffsetToLock UINT SizeToLock VOID **ppbData DWORD Flags;UINT OffsetToLock锁定区域偏移量,一般为0; UINT SizeToLock要锁定区域的大小; VOID **ppbData返回指向缓冲区数据的指针; DWORD Flags锁定行为标识符,一般设置为0;
3.memcpy用此函数将计算好的数据拷贝进缓冲区,如memcpy(in,out,sizeof(buffer));
4.HRESULT UnlockVOID;解除对数据区的锁定,一边流水线渲染可以正常执行
4.3D3D进行渲染;有两个基本函数
1.SetStreamSour__()用于将顶缓冲区设置到流水线中;HRESULT SetStreamSour__ UINT StreamNumber IDirect3DVertexBuffer9 *pStreamData UINT OffsetInBytes UINT Stride;UINT StreamNumber一般设置为0;IDirect3DVertexBuffer9 *pStreamData指向顶点缓冲区COM对象的指针; UINT OffsetInBytes指针偏移量不偏移则取0; UINT Stride顶点跨距,即每个顶点所占的字节数
2.SetFVF()用于将顶点自定义格式传递给流水线注IDirect3DDevi__9::SetFVFVertex::FVFFVF保存着顶点描述,FVF的定义形式如下#define FVF D3DFVF_XYZ|D3DFVF_DIFFUSE或 DWORDconst dwFVF=D3DFVF_XYZ|D3DFVF_NOR__L|D3DFVF_DIFFUSE;D3DFVF_XYZ表示顶点格式中包含顶点坐标信息它告知系统你的游戏没有变换过顶点,要求Direct3D来做顶点的变换工作D3DFVF_XYZRHW:告知系统你的游戏引擎已对顶点作过变换,Direct3D不需要再对它们作变换也就是说,Direct3D就不会再用世界矩阵、观察矩阵或投射矩阵来变换顶点了D3DFVF_DIFFUSE表示顶点格式中包含了一个漫反__色信息D3DFVF_SPECULAR:表示顶点格式中包含一个镜面反__色成分D3DFVF_NOR__L表示顶点格式中包含有顶点朝向信息(即法线向量)D3DFVF_TEX0——D3DFVF_TEX8包含顶点格式坐标的个数(1-8个)例如typedefstructSO__Vertex{FLOATxyz;//positionFLOATnxnynz;//nor__lDWORDdiffuse;//diffusecolorDWORDspecular;//specularcolorFLOATtutv;//firstpairoftexturecoordinatesFLOATtu2tv2tw2;//secondpairoftexturecoordinatesFLOATtu3tv3;//thirdpairoftexturecoordinatesFLOATtu4tv4;//fourthpairoftexturecoordinates}SO__Vertex;constDWORDgSO__VertexFVF=D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_SPECULAR|D3DFVF_NOR__L|D3DFVF_TEX4|D3DFVF_TEXCOORDSIZE20|D3DFVF_TEXCOORDSIZE31|D3DFVF_TEXCOORDSIZE22|D3DFVF_TEXCOORDSIZE23; IDirect3DDevi__9::DrawPrimitive HRESULTDrawPrimitiveD3DPRIMITIVETYPEPrimitiveTypeUINTStartVertexUINTPrimitiveCount;PrimitiveType定义了要使用的图元的类型共有六种typedefenumD3DPRIMITIVETYPE{D3DPT_POINTLIST=1//点,图元个数ND3DPT_LINELIST=2//线,图元个数为N/2D3DPT_LINESTRIP=3//D3DPT_________LIST=4D3DPT_________STRIP=5D3DPT_________FAN=6D3DPT_FOR___DWORD=0x7fffffff}D3DPRIMITIVETYPE*LPD3DPRIMITIVETYPE;StarVertex设置从顶点缓冲区中的第几个顶点画起PrimitiveCount要绘画的图元的数量
3.DrawPrimitive()HRESULT DrawPrimitive D3DPRIMITIVETYPE PrimitiveType图元类型 UINT StartVertex起始顶点 UINT PrimitiveCount要绘制的图元个数;完成上述过程就可以对定点进行渲染了渲染函数DrawPrimitive()不对顶点的格式进行再次检查比如同一个缓冲区可以,你本来打算是用来画三角形列表,但也可以画直线,或者三角形带、扇形等,函数不会再次检查
5.使用顶点索引缓冲区在一个3D模型中一个点可能要同时处于多个三角形面上,如果直接把顶点数据放进缓冲区,那么重复的顶点就会占用多余的内存使用顶点缓冲区把顶点的具体数据和代表三角形的顶点的索引分开存储,顶点数据还是放到顶点缓冲区中,顶点索引存储在顶点索引缓冲区中,这样可以节省不少内存,避免点的重复存储
5.1创建顶点索引缓冲区并填充之使用到的函数
1.HRESULT CreateIndexBuffer UINT Length DWORD Usage D3DFOR__T For__t D3DPOOL Pool IDirect3DIndexBuffer9** ppIndexBuffer HANDLE* pHandle;用于创建顶点索引缓冲区UINT Length顶点索引缓冲区的大小,有多少个索引,就有多少个顶点的字节大小; DWORD Usage可以置为0; D3DFOR__T For__tD3DFMT_INDEX16,D3DFMT_INDEX32分别表示用16位(可存储65536个顶点),32位存(可存储65536*65536个顶点)储索引值 D3DPOOL Pool可取D3DPOOL_DEFAULT; IDirect3DIndexBuffer9** ppIndexBuffer顶点索引缓冲区的COM对象指针; HANDLE* pHandle一般值为NULL;
2.HRESULT Lock UINT OffsetToLock UINT SizeToLock VOID **ppbData DWORD Flags;用于锁定顶点索引缓冲区并返回索引数据区指针;UINT OffsetToLock锁定偏移量,一般设置为0; UINT SizeToLock顶点索引缓冲区的字节数,等于顶点索引个数*索引位深/8; VOID **ppbData返回指向顶点索引缓冲数据区的指针,以便数据__; DWORD Flags一般设置为0;
3.HRESULT UnlockVOID;用于解除顶点索引缓冲区区注意一般手动填充顶点索引缓冲区,因为那几个顶点构成一个三角形有自己来确定;
5.2将顶点索引缓冲区设置到渲染管道流水线
1.HRESULT SetIndi__s IDirect3DIndexBuffer9 *pIndexData;其中的pIndexData为指向顶点索引缓冲区COM对象的指针;
2.HRESULT DrawIndexedPrimitive D3DPRIMITIVETYPE Type INT BaseVertexIndex UINT MinIndex UINT NumVerti__s UINT StartIndex UINT PrimitiveCount; D3DPRIMITIVETYPE Type图元类型; INT BaseVertexIndex初始顶点的索引值的偏移量,一般为0; UINT MinIndex最小顶点索引值,一般为0; UINT NumVerti__s顶点缓冲区中的顶点数量; UINT StartIndex起始的顶点索引,一般为0; UINT PrimitiveCount需要渲染的图元的个数;顶点索引缓冲区中的顶点顺序很重要,因为默认情况下,流水线只绘制点排列顺序为逆时针的三角形,而不绘制排列顺序为顺时针的三角形(可以设置为NOCULL模式这样渲染管线不裁剪)包含D3DFVF_XYZRHW的点可以直接绘制在屏幕上,而不需要变换这是因为生成一个包含D3DFVF_XYZRHW属性的VertexBuffer对象渲染流水线会认为改点已经进行了顶点变换,不要再将顶点数据作变换不乘世界矩阵视矩阵投影矩阵这是绘图时用的坐标系可以理解为简单的屏幕坐标系(即x正方向水平向左,y正方向竖直向下)英文TheRHWfloatwhensettooneindicatesthattheverti__arenottobetransformed.ThisisusedforGUIdevelopement.settingtheRHW____sthedirect3dpipelineNOTtoapplyanytransfor__tions__tri__stothemandyoucanthinkofthemaspure2dcoordsinsteadof3dcoords.
6.摄像机
6.1D3D中使用的几种常用的向量常用的有以下几种
1.D3DVECTOR定义在d3d9types.h头文件中,其为结构体,定义如下typedefstruct_D3DVECTOR {float xyz;}D3DVECTOR;D3DVECTOR属于3维向量
2.D3DXVECTOR2定义如下typedefstructD3DXVECTOR2 {FLOAT x;FLOAT y;}D3DXVECTOR2;D3DXVECTOR2属于2维向量D3DXVECTOR3定义如下typedefstruct{FLOAT x;FLOAT y;FLOAT z;}D3DXVECTOR3;D3DXVECTOR3属于3维向量D3DXVECTOR4定义如下typedefstructD3DXVECTOR4 {FLOAT x;FLOAT y;FLOAT z;FLOAT w;}D3DXVECTOR4;D3DXVECTOR4属于4维向量以上三者均在d3dx__th.h中定义(记忆方法同D3DCOLOR、D3DXCOLOR)
6.2D3D相机中使用的几种常用的关于向量的函数
1.D3DXVec3Dot;
2.D3DXVec3Nor__lize;
3.D3DXVec3Cross;
4.D3DX__trixRotationAxis;
5.D3DXVec3TransformCoord;介绍
1.FLOAT D3DXVec3Dot CONSTD3DXVECTOR3 *pV1CONSTD3DXVECTOR3 *pV2;该函数用于计算两个三维向量的点乘,并返回最终结果
2.D3DXVECTOR3 *WINAPI D3DXVec3Nor__lize D3DXVECTOR3 *pOut CONSTD3DXVECTOR3 *pV;该函数用于计算第二个向量的单位向量(即归一化向量),第二个参数为sour__即传入向量,并将计算结果存放于第一个参数中或返回
3.D3DXVECTOR3 *D3DXVec3Cross D3DXVECTOR3 *pOut CONSTD3DXVECTOR3 *pV1 CONSTD3DXVECTOR3 *pV2;该函数用于计算后两个向量的叉乘,并将结果放于第一个参数中或返回
4.D3DX__TRIX *D3DX__trixRotationAxisD3DX__TRIX *pOut CONSTD3DXVECTOR3 *pV FLOAT Angle;D3DX__TRIX *pOut根据旋转角度和转轴计算出来的绕pV轴旋转Angle弧度应使用的旋转矩阵 CONSTD3DXVECTOR3 *pV用于定义旋转轴的向量 FLOAT Angle旋转过的弧度,因为实在左手坐标系中,所以顺时针转动为正Anglesaremeasuredclockwisewhenlookingalongtherotationaxistowardtheorigin
5.下面来看看D3DXVec3TransformCoord()函数D3DXVECTOR3 *D3DXVec3TransformCoord D3DXVECTOR3 *pOut CONSTD3DXVECTOR3 *pV CONSTD3DX__TRIX *pM;计算点pV经过矩阵pM旋转后的值,并将值放于pOut中或返回
6.3点和向量的区别坐标和向量是有区别的向量的第四维数值是0,坐标的第四维数值是1;向量=两个坐标的差值 ,第四维同样做减法,结果是0;向量的坐标变换用D3DXVec3TransformNor__l点的变换用D3DXVec3TransformCoordD3DXVec3Transform和D3DXVec3TransformCoord相似,区别在于后者变换后将w投射回
16.3Camera相机矩阵计算问题参见函数D3DX__trixLookatLH()其最终计算出来的相机矩阵各个参数如下D3DX__TRIX *WINAPI D3DX__trixLookAtLH D3DX__TRIX *pOut CONSTD3DXVECTOR3 *pEye CONSTD3DXVECTOR3 *pAt CONSTD3DXVECTOR3 *pUp;Re__rksThereturnvalueforthisfunctionisthesamevaluereturnedinthepOutparameter.InthiswaytheD3DX__trixLookAtLHfunctioncanbeusedasaparameterforanotherfunction.Thisfunctionusesthefollowingformula(表达式)tocomputethereturned__trix.cam_pos=eye.cam_lookat=zaxis=nor__lAt-Eye(在RH中为nor__lEye-At)cam_right=xaxis=nor__lcrossUpzaxiscam_up=crosszaxisxaxisxaxis.xyaxis.xzaxis.x0xaxis.yyaxis.yzaxis.y0xaxis.zyaxis.zzaxis.z0-dotxaxiseye-dotyaxiseye-dotzaxiseye
17.基本纹理应用
7.1纹理尺寸纹理都是2D的__,它可以保存为bmp、tga、jpg或是任何一种常见的__格式,所以它肯定有大小虽然理论上现在的新型显卡可以支持任意尺寸的纹理,不过为了兼容以前的显卡也为了程序的执行效率,你最好把纹理的尺寸做成2的n次方如16x1632x3264x64128x128256x256等等
7.2纹理坐标纹理坐标又叫贴图坐标,在D3D中用两个0到1的浮点值(UV)来设置一个点的纹理坐标,U是横轴、V是纵轴纹理的左上角为
(00),右下角为
(11)
7.3基本纹理添加步骤以及所使用的函数
1.为顶点添加纹理坐标u、v并修改顶点的FVF
2.定义纹理对象指针并创建纹理对象如:LPDIRECT3DTEXTURE9ppTexture;//定义纹理对象指针HRESULT D3DXCreateTextureFromFile LPDIRECT3DDEVI__9 pDevi__ LPCTSTR pSrcFile LPDIRECT3DTEXTURE9 *ppTexture;LPDIRECT3DDEVI__9 pDevi__//设备对象 LPCTSTR pSrcFile//待作为纹理的图像名称LPDIRECT3DTEXTURE9 *ppTexture;//纹理对象指针
3.将纹理设置到渲染管线并渲染
1.HRESULTSetTextureDWORDSampler//将一张纹理指派给设备中的某个特定的阶段IDirect3DBaseTexture9*pTexture//纹理对象指针SetTexture方法将一张纹理指派给设备中的某个特定的阶段Direct3D提供了8个阶段(0到7),这意味着可以为一次DrawPrimitive调用同时设置最多8张纹理(然而,你也可以多次调用DrawPrimitive,这称“多次渲染”)SetTexture的第一个参数中给出一个希望使用的纹理阶段编号第二个参数为纹理对象指针当一个应用程序选择了一张纹理作为当前纹理时,它就指示Direct3D设备在下一次改变当前纹理之前,一直将该纹理应用到所有被渲染的图元上去如果3D场景中的每个图元都有其自己的纹理,则必需在绘制每个图元之前设置相应的纹理,也就是说应在调用DrawPrimitive函数之前进行纹理设置
2.HRESULTSetTextureStageStateDWORDStage//持有该纹理接口的纹理阶段号D3DTEXTURESTAGESTATETYPEType//纹理状态类型DWORDValue//指定纹理状态类型的值;SetTextureStageState可用于在不同的材质__terial之间对颜色和alpha作混合可用它来指定Direct3D纹理引擎的操作和参数首先应选择想要使用的纹理,在第一个参数中给出持有该纹理接口的纹理阶段号第2个参数用来设置纹理状态类型
8.模型加载
1.装载模型模型加载函数一般使用D3DXLoadMeshFromX将模型加载到内存(笼统说法)中HRESULT WINAPI D3DXLoadMeshFromX LPCTSTR pFilename//.x文件名称 DWORD Options//Mesh存储内存类型 LPDIRECT3DDEVI__9 pD3DDevi__//设备对象 LPD3DXBUFFER *ppAdja__ncy//一般设为NULL LPD3DXBUFFER *pp__terials//材质扩展对象结构指针 LPD3DXBUFFER *ppEffectInstan__s//特效对象 DWORD *pNum__terials//纹理数目(等于材质数目) LPD3DXMESH *ppMesh;//Mesh对象指针
2.填充纹理和材质注意D3DXLoadMeshFromX函数中的LPD3DXBUFFER,其结构为typedefinte_____ID3DXBufferID3DXBuffer;typedefinte_____ID3DXBuffer*LPD3DXBUFFER;ID3DXBuffer——COM对象其成员函数LPVOID GetBufferPointerVOID用于返回扩展缓冲区数据区指针在D3DXLoadMeshFromX()中LPD3DXBUFFER*类型的pp__terials是材质扩展结构对象的定义如下typedefstructD3DX__TERIAL {D3D__TERIAL9 __tD3D;//Mesh的材质结构体LPSTR pTextureFilename;//Mesh纹理__对应的名字}D3DX__TERIAL;它存储了一个Mesh的所有纹理(纹理只包含作为纹理__的名字)和材质,由于D3DXMESH并没有___提供模型的材质和纹理管理,所以必须自己做这件事情将纹理和材质填充到数据区这就需要将D3DX__TERIAL 结构中的数据自己写入到D3D__TERIAL 9和材质对象中;
3.渲染一切准备就绪,渲染吧要注意,在.x文件被读入时,模型是被切分了的,每一个材质对应一部分的模型//根据材质的数量我们的模型被切分了,每个材质对应一部分,即材质被分为几部分,就按几部分渲染forDWORDi=0;ig_dwNum__terials;i++{//为这一部分设置材质g_pd3dDevi__-Set__terialg_pMesh__terials[i];g_pd3dDevi__-SetTexture0g_pMeshTextures[i];//渲染这一部分g_pMesh-DrawSubseti;}注在最后别忘了将材质对象数组释放forDWORDi=0;ig_dwNum__terials;i++{SafeRelease(g_pMeshTextures[i]);}。