【vc++精品源码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了vc++精品源码-VC++2010游戏开发随记之三十九 - 其它资料的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
【Visual C】游戏开发笔记三十九 浅墨 DirectX 教程之七 他山之石:几种几何体的快捷绘制法本篇文章里,我们对 Direct3D 之中几种几何体的简洁绘制方法进行了详细的剖析,最后依旧是提供文章配套的详细注释的 demo 源代码的欣赏, (这 并在文章末尾提供了源代码下载。
标题有些歧义的,这个几种是修饰几何体的,而绘制的方法只有一种 :D)首先需要跟大家道声歉,上个周末因为浅墨个人的原因。
没把想写的内容的思路整理好,所以就停更了一次。
好了,别的废话咱不说了,下面直奔本周主题一、D3D 中内置的几何体概述通过前面的讲解大家应该会发现,使用顶点缓存和索引缓存通过绘制三角形单元来绘制图形还是有一点复杂的,需要一定的想象力和大量顶点和索引的设置,我们一般很少去这样通过逐个设置顶点缓存和索引缓存来进行画面上几何体的绘制的。
而比较人性化的是,Direct3D为我们提供了几种特殊的生成简单 3D 几何体的网格数据的方法。
可以说是在我们学习从文件载入网格数据之前,为我们提供了很多便利,丰富了我们的学习时的图形素材。
下面我们就来看看这几个快捷的几何体绘制函数,他们分别是立方体(Cube),圆环体(Torus),多边形(Polygon),球面体(Sphere),茶壶(Teapot)和圆柱体(Cylinder)。
(以目前最新的 Microsoft DirectX SDK June 2010为 ) Windows我们可以在 DirectX SDK 例 的DirectX Graphics.chm 文档中依次展开【Windows DirectX Graphics Documentation】-gt【Direct3D 9 Graphics】【Reference for Direct3D 9】【D3DX Reference】【D3DX Functions】 -gt -gt -gt-gt【Shape Drawing Functions】找到这些函数的说明文档,这是这些函数最官方最原始的参考地址了。
不过显然这些 DirectX SDK Document 都是纯英文的,和大众之间的距离还是比较疏远。
先给大家看看这几个函数的全家福,后面我们会全部详细介绍使用方法的:D3DXCreateBox 用于创建一个盒子,立方体D3DXCreateSphere 用于创建一个球面体D3DXCreateCylinder 用于创建一个柱体D3DXCreateTeapot 用于创建一个茶壶D3DXCreatePolygon 用于创建一个多边形D3DXCreateTorus 用于创建一个圆环体我们可以看到这些函数的名字取的都非常的憨厚老实,一开始是 D3DX然后紧跟其后一个Create,表示是在创建某东西,最后跟上对应的几何体名,比如 Teapot 茶壶,这样连起来就非常好记忆了,D3DXCreateTeapot。
二、D3D 中几种内置的几何体绘制四步曲首先需要说明的是下面提到的 ID3DXMesh 接口类型是后面我们在讲解网格相关知识的时候重点讲解的内容,这里大家先对其有一个大概的印象就可以了。
想要通过这几个函数快捷绘制出一个几何体,需要以下几步:1.定义一个 ID3DXMesh 接口类型的对象。
2.调用这六个函数的其中一个对我们在第一步里面定义的这个对象进行初始化,也就是把创建好的网格存储在我们定义好的 ID3DXMesh 类型的对象中3.在 Direct3D 渲染五步曲的第三步,也就是在 BeginScene 之后调用 DrawSubset 方法进行网格图形的绘制,即是拿着第二步里面初始化好的 ID3DXMesh 接口类型的对象指一下DrawSubset0方法就好了4.绘制完成之后,调用 ID3DMesh 接口的 Release 方法,或者我们自定义的 COM 接口释放宏进行资源的释放。
总结起来也就简明扼要八个字:定义,创建,绘制,释放方便大家理解各个过程,给出一个配套的注释好的代码:cpp view plaincopyprint 1. //四步曲之一,定义 2. ID3DXMesh meshBox 3. //四步曲之二,创建 4. D3DXCreateBox g_pd3dDevice 2.0f 2.0f 2.0fampmeshBox 0 5. //四步曲之三,绘制 6. g_pd3dDevice-gtBeginScene 7. meshBox-gtDrawSubset0 8. //四步曲之四,释放 9. meshBox-gtRelease三、D3D 中几种内置几何体的创建详细剖析这一小节里面讲解的都是上文我们提到的几何体绘制四步曲的第二步里面的具体创建方法,但是配套的调用实例都包含了四步曲里面的前三步,大家需要注意下。
1. 立方体的创建——D3DXCreateBox 方法D3DXCreateBox 方法用于创建一个立方体,或者说是一个盒子。
cpp view plaincopyprint 1. HRESULT D3DXCreateBox 2. __in LPDIRECT3DDEVICE9 pDevice//Direct3D 设备对象 3. __in FLOAT Width //盒子的宽度 4. __in FLOAT Height//盒子的高度 5. __in FLOAT Depth//盒子的深度 6. __out LPD3DXMESH ppMesh//存储着盒子网格的指针 7. __out LPD3DXBUFFER ppAdjacency//存储三角形索引的指针 8. █ 第一个参数,LPDIRECT3DDEVICE9 类型的 pDevice,指向 IDirect3DDevice9 接口的指针,这样一般就填我们在初始化四步曲里面创建的有效的 Direct3D 绘制”金钥匙”——Direct3D 设备对象 g_pd3dDevice。
表示 Direct3D 设备对象和我们创建的这个盒子网格之间关联起来了。
█第二个参数,FLOAT 类型的 Width,表示我们创建的盒子沿着 X 轴的宽度。
█第三个参数,FLOAT 类型的 Height表示我们创建的盒子沿着 Y 轴的高度。
█第四个参数 FLOAT 类型的 Depth,表示我们创建的盒子沿着 Z 轴的深度。
█第五个参数,LPD3DXMESH 类型的ppMesh,一个存储着我们创建的形状的指针的地址,也就是绘制用 D3DXCreateBox 函数创建的网格的金钥匙,后面需要绘制我们用这个函数创建的盒子网格的话,拿这个指针指一下 DrawSubset 方法,也就是这样写g_box-gtDrawSubset0█第六个参数,LPD3DXBUFFER 类型的ppAdjacency,它存储着我们在这里绘制的网格的三角形索引的指针,我们不用他的话,设为 0 就可以了。
下面是一个调用实例,创建一个长方体:cpp view plaincopyprint 1. //用此函数产生一个长方体 2. ID3DXMesh meshBox 3. D3DXCreateBox 4. g_pd3dDevice //D3D 绘制对象 5. 2.0f //宽度 6. 2.0f //高度 7. 2.0f //深度 8. ampmeshBox//对应 COM 对象 9. 0 //指向 ID3DXBuffer,存放相邻平面的信息,通常设 置成 0或 NULL 10. 11. g_pd3dDevice-gtBeginScene 12. meshBox-gtDrawSubset02. 柱体的创建——D3DXCreateCylinder 方法D3DXCreateCylinder 方法用于创建柱体。
cpp view plaincopyprint 1. HRESULT D3DXCreateCylinder 2. __in LPDIRECT3DDEVICE9 pDevice 3. __in FLOAT Radius1 4. __in FLOAT Radius2 5. __in FLOAT Length 6. __in UINT Slices 7. __in UINT Stacks 8. __out LPD3DXMESH ppMesh 9. __out LPD3DXBUFFER ppAdjacency 10. █ 第一个参数,LPDIRECT3DDEVICE9 类型的 pDevice,指向 IDirect3DDevice9 接口的指针,这样一般就填我们在初始化四步曲里面创建的有效的 Direct3D 绘制”金钥匙”——Direct3D 设备对象 g_pd3dDevice。
表示 Direct3D 设备对象和我们创建的这个柱体网格之间关联起来了。
█ 第二个参数,FLOAT 类型的 Radius1,表示我们创建的柱体沿 Z 轴负方向的半径大小,这个参数显然必须大于等于 0.0f。
█ 第三个参数,FLOAT Radius2 表示我们创建的柱体沿 Z 轴正方向的半径大小,这个参数显然必须大于等于 0.0f。
█ 第四个参数,FLOAT 类型的 Length,表示我们创建的柱体沿 Z 轴的长度。
█ 第五个参数,UINT 类型的 Slices,表示柱体的外围有几个面,举个例子,如果设为 8 的
上一篇:
开源RTP源代码
下一篇:
法律专业开题报告范文