游戏编程技术-I3D编程ppt.ppt

上传人:工**** 文档编号:573924178 上传时间:2024-08-15 格式:PPT 页数:60 大小:596.50KB
返回 下载 相关 举报
游戏编程技术-I3D编程ppt.ppt_第1页
第1页 / 共60页
游戏编程技术-I3D编程ppt.ppt_第2页
第2页 / 共60页
游戏编程技术-I3D编程ppt.ppt_第3页
第3页 / 共60页
游戏编程技术-I3D编程ppt.ppt_第4页
第4页 / 共60页
游戏编程技术-I3D编程ppt.ppt_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《游戏编程技术-I3D编程ppt.ppt》由会员分享,可在线阅读,更多相关《游戏编程技术-I3D编程ppt.ppt(60页珍藏版)》请在金锄头文库上搜索。

1、游戏编程技术游戏编程技术-IDirect Graphics 3D的奇幻世的奇幻世界界 1画一个圆锥建模 圆锥由一个曲面和一个 底面构成,用两个图元 构建实体比较合理,其 中每个图元各代表一个面。考虑到圆锥曲面展开后为一个扇面,所以图元格式采用三角扇形,而底面是一个圆,也采用三角扇形,取圆锥外表面做图元的正面。A为圆锥的顶点,B为底面的圆心,把底面分成30等份,得到30个分割点C1、C2 . . C30,则圆锥曲面的图元所对应的顶点序列为A、C1、C2 . . C30、C1,共32个顶点,注意在结尾处C1点重复出现了一次,否则画出的圆锥不完整。同理底面也由32个顶点组成,依次为B、C1、C30、

2、C29 . . C1。2设圆锥高为2,底面半径为1,以圆锥中心线AB(图中的蓝线)做X轴,坐标原点设在AB中点,A的坐标为(-1,0,0),则B的坐标为(1,0,0),C1至C30的坐标为(1,sink,cosk)。 由于使用灯光照明,还需要提供顶点法线:对于圆锥曲面,A的顶点法线取X轴的负方向,即矢量-1,0,0,C1至C30的顶点法线取有向线段BCk,矢量为0,sink,sink;对于圆锥底面,顶点法线都设为X轴的正方向,矢量为1,0,0。请注意,在Direct3D中,要求顶点法线为单位矢量。 3首先定义两个图元的FVF,因为使用灯光渲染,顶点颜色不再需要,新的FVF包括坐标和顶点法线:

3、#include D3DWnd.h /圆锥曲面的FVF格式:坐标、顶点法线 struct CUSTOMVERTEX1 D3DXVECTOR3 position; /顶点坐标 D3DXVECTOR3 normal; /顶点法线 ; #define D3DFVF_CUSTOMVERTEX1 (D3DFVF_XYZ | D3DFVF_NORMAL) 4/圆锥底面的FVF格式:坐标、顶点法线 struct CUSTOMVERTEX2 D3DXVECTOR3 position; /顶点坐标 D3DXVECTOR3 normal; /顶点法线 ; #define D3DFVF_CUSTOMVERTEX2

4、(D3DFVF_XYZ | D3DFVF_NORMAL) void SetupMatrices(); LPDIRECT3DVERTEXBUFFER9 m_pVB1; /圆锥曲面的顶点缓存区接口指针 LPDIRECT3DVERTEXBUFFER9 m_pVB2; /圆锥底面的顶点缓存区接口指针5CD3DWnd:InitGeometry,建立圆锥的几何模型void CD3DWnd:InitGeometry() /建立圆锥曲面的数学模型 CUSTOMVERTEX1 vertices132; vertices10.position = D3DXVECTOR3( -1.0f, 0.0f, 0.0f );

5、 /点A的坐标 vertices10.normal = D3DXVECTOR3( -1.0f, 0.0f, 0.0f ); /点A的法线矢量 for (int i = 1; i CreateVertexBuffer( sizeof(vertices1), 0, D3DFVF_CUSTOMVERTEX1, D3DPOOL_DEFAULT, &m_pVB1, NULL ); void* pVertices; m_pVB1-Lock( 0, sizeof(vertices1), (void*)&pVertices, 0 ); memcpy( pVertices, vertices1, sizeof(

6、vertices1) ); m_pVB1-Unlock(); 7/建立圆锥底面的数学模型 CUSTOMVERTEX2 vertices232; vertices20.position = D3DXVECTOR3( 1.0f, 0.0f, 0.0f ); /点B的坐标 vertices20.normal = D3DXVECTOR3( 1.0f, 0.0f, 0.0f ); /点B的法线矢量 for (i = 1; i CreateVertexBuffer( sizeof(vertices2), 0, D3DFVF_CUSTOMVERTEX2, D3DPOOL_DEFAULT, &m_pVB2,

7、NULL ); m_pVB2-Lock( 0, sizeof(vertices2), (void*)&pVertices, 0 ); memcpy( pVertices, vertices2, sizeof(vertices2) ); m_pVB2-Unlock(); 9添加灯光和材质 用一个白色的平行光进行照明,灯光方向指向左下方,矢量为-1,-1,0;环境光设为一个亮度很低的灰度光;圆锥曲面的材质设为白色,底面设为黄色,没有镜面反射。 为CD3DWnd添加三个成员函数:SetLight、SetMaterial1、SetMaterial2,分别用于设置灯光、圆锥曲面材质、圆锥底面材质: 10

8、void CD3DWnd:SetLight() /创建一个白色的平行光 D3DLIGHT9 light; :ZeroMemory( &light, sizeof(D3DLIGHT9) ); light.Type = D3DLIGHT_DIRECTIONAL; /灯光类型 light.Diffuse.r = 1.0f; light.Diffuse.g = 1.0f; light.Diffuse.b = 1.0f; light.Direction = D3DXVECTOR3( -1.0f, -1.0f, 0.0f ); light.Range = 1000.0f; /灯光的作用范围 m_pDevi

9、ce-SetLight( 0, &light ); /设置灯光,参数1为灯光的索引号 m_pDevice-LightEnable( 0, TRUE );/打开灯光,参数1为灯光的索引号 /设置环境光 m_pDevice-SetRenderState( D3DRS_AMBIENT, D3DCOLOR_RGBA(32,32,32,0) ); 11void CD3DWnd:SetMaterial1() /创建一个白色的材质 D3DMATERIAL9 mtrl; :ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) ); mtrl.Diffuse.r = mtrl.Ambi

10、ent.r = 1.0f; mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f; mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f; mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f; m_pDevice-SetMaterial( &mtrl ); /设置材质 12void CD3DWnd:SetMaterial2() /创建一个黄色的材质 D3DMATERIAL9 mtrl; :ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) ); mtrl.Diffuse.r = mtrl.Am

11、bient.r = 1.0f; mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f; mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f; mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f; m_pDevice-SetMaterial( &mtrl ); /设置材质 13修改渲染函数CD3DWnd:Render加入圆锥绘制代码m_pDevice-BeginScene(); SetupMatrices(); /设置变换矩阵 SetLight(); /设置灯光 /绘制圆锥曲面的图元 SetMaterial1(); /使

12、用白色的材质 m_pDevice-SetFVF( D3DFVF_CUSTOMVERTEX1 ); m_pDevice-SetStreamSource( 0, m_pVB1, 0, sizeof(CUSTOMVERTEX1) ); m_pDevice-DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 30 ); 14/绘制圆锥底面的图元 SetMaterial2(); /使用黄色的材质 m_pDevice-SetFVF( D3DFVF_CUSTOMVERTEX2 ); m_pDevice-SetStreamSource( 0, m_pVB2, 0, sizeof(CUST

13、OMVERTEX2) ); m_pDevice-DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 30 ); m_pDevice-EndScene(); 1516高洛德着色和平面着色Direct3D中用于渲染三角形的两种着色算法: 平面着色(Flat Shading),也叫做“恒量着色”,是一种最简单也是最快速的着色算法。每个三角形使用一种颜色进行填充。这种方法的显示效果最差,一般用在要求速度重于细节的场合 高洛德着色(Gouraud Shading),其显示效果要好得多,它是游戏中使用最广泛的一种着色算法。高洛德着色对实体模型各顶点的颜色进行平滑、融合处理,为每个三角

14、形上的每个点赋以一个独立的颜色值,将三角形着上较为顺滑的渐变色,使其外观更加真实,但着色速度比平面着色慢许多。17Direct3D缺省使用高洛德着色,如果想改用平面着色,只需调用IDirect3DDevice9:SetRenderState,把渲染状态D3DRS_SHADEMODE设置为D3DSHADE_FLAT即可。18添加纹理纹理就是通常所说的贴图,它通过在三维的模型表面覆盖上二维的图片,使实体更具有真实感19纹理都是一些标准的位图,支持BMP、JPG、PNG、TGA等格式。虽然Direct3D对纹理图片的大小没有限制,但为了程序的执行效率,最好使用正方形图片,而且边长是2的n次方,比如6

15、4 x 64、128 x 128、256 x 256等等。201)纹理坐标 :纹理图片本身构成了一个二维的坐标空间,纹理坐标(Texture Coordinate)用于在纹理上指定一个点.21当把纹理应用于图元时,需要为每个顶点指定一组纹理坐标,标明该顶点在贴图中的位置,从而建立起图元和纹理图片之间的映射关系。把纹理图片想象成一片弹性很好的橡皮薄膜,贴图过程就相当于用钉子把橡皮固定在与其纹理坐标相对应的顶点上。 22纹 理 坐 标 的 正 常 取 值 范 围 为 0-1, 但Direct3D也允许纹理坐标取此范围之外的值,以获取某些特殊的纹理效果232)纹理滤波 纹理滤波(Texture Fi

16、ltering)是指纹理图片映射到图元的方式,Direct3D支持以下方式: 最近点采样 双线性滤波 各向异性滤波 Mipmap滤波 pdevice-SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); pdevice-SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); pdevice-SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR ); 243)纹理混合 当使用纹理时,实体的外观由纹理图片和材质经过某种计算获得,

17、这个过程被称作纹理混合(Texture Blending),pdevice-SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_ADD); /运算类型:加 pdevice-SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE); /运算对象1:纹理 pdevice-SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); /运算对象2:材质 25用纹理渲染 2627首先要确定图元各顶点的纹理坐标,圆锥曲面展开后是一个扇形,其中C1、

18、C2 . . C30是等分点,则A的纹理坐标为(0,0.5),Ck的纹理坐标为(0.5sink ,0.5-0.5cosk)。 28修改圆锥曲面的FVF定义,加入纹理坐标: (D3DWnd.cpp) #include D3DWnd.h /圆锥曲面的FVF格式:坐标、顶点法线、纹理坐标 struct CUSTOMVERTEX1 D3DXVECTOR3 position; /顶点坐标 D3DXVECTOR3 normal; /顶点法线 float tu, tv; /纹理坐标 ; /D3DFVF_TEX1表示只使用一层纹理 #define D3DFVF_CUSTOMVERTEX1 (D3DFVF_XY

19、Z | D3DFVF_NORMAL | D3DFVF_TEX1) 29/建立圆锥曲面的数学模型 CUSTOMVERTEX1 vertices132; vertices10.position = D3DXVECTOR3( -1.0f, 0.0f, 0.0f ); vertices10.normal = D3DXVECTOR3( -1.0f, 0.0f, 0.0f ); vertices10.tu = 0.0f; /点A的纹理坐标 vertices10.tv = 0.5f; 点A的纹理坐标 30顶点序列的纹理坐标for (int i = 1; i GetBufferPointer(); 44for

20、( DWORD i=0; i Release(); /释放接口 45在CD3DWnd:Cleanup中释放新创建的COM对象for (DWORD i = 0; i Release(); /释放纹理对象 delete m_pMeshMaterials; delete m_pMeshTextures; m_pMesh-Release(); /释放Mesh对象 m_pDevice-Release(); 46模型比较大,如果按原尺寸显示,在Direct3D窗口中只能看到部分画面,因此要在世界变换矩阵中增加一个缩放矩阵,对其进行缩小。函数CD3DWnd:SetupMatrices修改模型放大缩小47fl

21、oat angle = m_nRotateY * D3DX_PI / 180; D3DXMATRIX matWorld; D3DXMATRIX matRotate; D3DXMATRIX matZoom; /计算旋转变换矩阵 :D3DXMatrixRotationY( &matRotate, angle ); /计算缩放变换矩阵:缩小5倍 :D3DXMatrixScaling( &matZoom, 0.2f, 0.2f, 0.2f ); /世界变换矩阵缩放矩阵旋转矩阵 :D3DXMatrixMultiply( &matWorld, &matZoom, &matRotate ); /把世界变换矩

22、阵设置到渲染环境 m_pDevice-SetTransform( D3DTS_WORLD, &matWorld );48修改函数CD3DWnd:Render渲染Mesh模型m_pDevice-BeginScene(); SetupMatrices(); SetLight(); for( DWORD i=0; i SetMaterial( &m_pMeshMaterialsi ); /设置子集的纹理,混合方式使用缺省值:纹理 材质的漫反射 49m_pDevice-SetTexture( 0, m_pMeshTexturesi ); /绘制子集 m_pMesh-DrawSubset( i ); m

23、_pDevice-SetTexture( 0, NULL); m_pDevice-EndScene(); 5051显示文本 Direct3D中的文本可分为二维和三维两种文本52二维文本二 维 文 本 的 显 示 是 借 助 纹 理 实 现 的 。Direct3D把这些实现细节封装在字体接口ID3DXFont,通过调用其方法DrawText,可以很方便地在窗口中输出文本。DrawText使用窗口坐标系,53CFont font; font.CreatePointFont( 120, 宋体, NULL ); /创建显示文本所用的字体 LPD3DXFONT pfont; :D3DXCreateFon

24、t( pdevice, (HFONT)font.m_hObject, &pfont ); /从已有字体创建接口 54pfont-DrawText( /调用方法ID3DXFont:DrawText显示文本 二维文本, /文本内容 8, /文本长度 CRect(0,0,100,50), /文本的显示区域,使用窗口坐标 DT_LEFT, /显示格式:左对齐 D3DCOLOR_XRGB(255,0,0) ); /文本颜色:红色 55三维文本三 维 文 本 是 通 过 Mesh模 型 实 现 的 。Direct3D提供了一个函数D3DXCreateText,可以生成文本的Mesh模型,然后显示。文本Me

25、sh模型只有一个子集,而且不包括材质和纹理,需要另外定义。D3DXCreateText不支持汉字。 56/创建三维文本的Mesh对象 :D3DXCreateText( m_pDevice, memdc.m_hDC, /Direct3D使用设备环境中的字体来创建Mesh对象 3D, /文本内容 0.001f, /定义了字体轮廓的圆滑程度,取值越小,字体越圆滑 0.4f, /文本在Z轴方向上的厚度 &m_pMesh, NULL, NULL ); 57由于用D3DXCreateText生成的文本Mesh模型,其大小是一个固定值,和所用字体的尺寸无关,因此只能通过世界座标变换来调整文本的大小:D3DX

26、MatrixRotationY( &matRotate, angle ); /计算缩放变换矩阵:放大2倍 :D3DXMatrixScaling( &matZoom, 2.0f, 2.0f, 2.0f ); :D3DXMatrixMultiply( &matWorld, &matZoom, &matRotate ); 58在函数CD3DWnd:Render中加入三维文本的显示代码:/设置三维文本所用的材质:黄色 D3DMATERIAL9 mtrl; :ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) ); mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f; mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f; mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f; mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f; m_pDevice-SetMaterial( &mtrl ); /显示三维文本 m_pMesh-DrawSubset(0); m_pDevice-EndScene(); 5960

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号