【Visual C++】游戏开发笔记三十九 浅墨DirectX教程之七 他山之石 几种几何体的快捷绘制法

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

 

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  

文章链接: http://blog.csdn.net/zhmxy555/article/details/8475261

作者:毛星云(浅墨)    邮箱: happylifemxy@163.com   

 

 

 

本篇文章里,我们对Direct3D之中几种几何体的简洁绘制方法进行了详细的剖析,最后依旧是提供文章配套的详细注释的demo源代码的欣赏,并在文章末尾提供了源代码下载。(这标题有些歧义的,这个几种是修饰几何体的,而绘制的方法只有一种 :D)

 

首先需要跟大家道声歉,上个周末因为浅墨个人的原因。没把想写的内容的思路整理好,所以就停更了一次。

 好了,别的废话咱不说了,下面直奔本周主题~

 

 

 

一、D3D中内置的几何体概述

 

 

 

通过前面的讲解大家应该会发现,使用顶点缓存和索引缓存通过绘制三角形单元来绘制图形还是有一点复杂的,需要一定的想象力和大量顶点和索引的设置,我们一般很少去这样通过逐个设置顶点缓存和索引缓存来进行画面上几何体的绘制的。而比较人性化的是,Direct3D为我们提供了几种特殊的生成简单3D几何体的网格数据的方法。可以说是在我们学习从文件载入网格数据之前,为我们提供了很多便利,丰富了我们的学习时的图形素材。下面我们就来看看这几个快捷的几何体绘制函数,他们分别是立方体(Cube),圆环体(Torus),多边形(Polygon),球面体(Sphere),茶壶(Teapot)和圆柱体(Cylinder)。

 

我们可以在DirectX SDK(以目前最新的Microsoft DirectX SDK (June 2010)为例)的Windows DirectX Graphics.chm文档中依次展开【Windows DirectX Graphics Documentation】->【Direct3D 9 Graphics】->【Reference for Direct3D 9】->【D3DX Reference】->【D3DX Functions】->【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接口类型的对象指一下DrawSubset(0)方法就好了

 

4.绘制完成之后,调用ID3DMesh接口的Release方法,或者我们自定义的COM接口释放宏进行资源的释放。

 

 

总结起来也就简明扼要八个字:

 

定义,创建,绘制,释放

 

 

方便大家理解各个过程,给出一个配套的注释好的代码:

//四步曲之一,定义ID3DXMesh* meshBox;//四步曲之二,创建D3DXCreateBox(  g_pd3dDevice,  2.0f, 2.0f,   2.0f,&meshBox, 0  );//四步曲之三,绘制g_pd3dDevice->BeginScene();meshBox->DrawSubset(0);//四步曲之四,释放meshBox->Release();


 

 

 

三、D3D中几种内置几何体的创建详细剖析

 

 

这一小节里面讲解的都是上文我们提到的几何体绘制四步曲的第二步里面的具体创建方法,但是配套的调用实例都包含了四步曲里面的前三步,大家需要注意下。

 

 

1. 立方体的创建——D3DXCreateBox方法

 

D3DXCreateBox方法用于创建一个立方体,或者说是一个盒子。

HRESULT  D3DXCreateBox(  __in   LPDIRECT3DDEVICE9 pDevice,//Direct3D设备对象  __in   FLOAT Width, //盒子的宽度  __in   FLOAT Height,//盒子的高度  __in   FLOAT Depth,//盒子的深度  __out  LPD3DXMESH *ppMesh,//存储着盒子网格的指针  __out  LPD3DXBUFFER *ppAdjacency//存储三角形索引的指针);

█ 第一个参数,LPDIRECT3DDEVICE9类型的pDevice,指向IDirect3DDevice9接口的指针,这样一般就填我们在初始化四步曲里面创建的有效的Direct3D绘制”金钥匙”——Direct3D设备对象g_pd3dDevice。表示Direct3D设备对象和我们创建的这个盒子网格之间关联起来了。

█第二个参数,FLOAT类型的Width,表示我们创建的盒子沿着X轴的宽度。

█第三个参数,FLOAT类型的Height,表示我们创建的盒子沿着Y轴的高度。

█第四个参数 , FLOAT类型的Depth,表示我们创建的盒子沿着Z轴的深度。

█第五个参数,LPD3DXMESH类型的*ppMesh,一个存储着我们创建的形状的指针的地址,也就是绘制用D3DXCreateBox函数创建的网格的金钥匙,后面需要绘制我们用这个函数创建的盒子网格的话,拿这个指针指一下DrawSubset方法,也就是这样写g_box->DrawSubset(0);

█第六个参数,LPD3DXBUFFER类型的*ppAdjacency,它存储着我们在这里绘制的网格的三角形索引的指针,我们不用他的话,设为0就可以了。

 

 

下面是一个调用实例,创建一个长方体:

 

//用此函数产生一个长方体         ID3DXMesh* meshBox;         D3DXCreateBox(                              g_pd3dDevice, //D3D绘制对象                            2.0f, //宽度                            2.0f, //高度                            2.0f, //深度                            &meshBox,//对应COM对象                            0 //指向ID3DXBuffer,存放相邻平面的信息,通常设置成0(或NULL)                            );         g_pd3dDevice->BeginScene();         meshBox->DrawSubset(0);


 

 

 

2. 柱体的创建——D3DXCreateCylinder方法

 

D3DXCreateCylinder方法用于创建柱体。

HRESULT  D3DXCreateCylinder(  __in   LPDIRECT3DDEVICE9 pDevice,  __in   FLOAT Radius1,  __in   FLOAT Radius2,  __in   FLOAT Length,  __in   UINT Slices,  __in   UINT Stacks,  __out  LPD3DXMESH *ppMesh,  __out  LPD3DXBUFFER *ppAdjacency);

 

█ 第一个参数,LPDIRECT3DDEVICE9类型的pDevice,指向IDirect3DDevice9接口的指针,这样一般就填我们在初始化四步曲里面创建的有效的Direct3D绘制”金钥匙”——Direct3D设备对象g_pd3dDevice。表示Direct3D设备对象和我们创建的这个柱体网格之间关联起来了。

█ 第二个参数,FLOAT类型的Radius1,表示我们创建的柱体沿Z轴负方向的半径大小,这个参数显然必须大于等于0.0f。

█ 第三个参数,FLOAT Radius2, 表示我们创建的柱体沿Z轴正方向的半径大小,这个参数显然必须大于等于0.0f。

 

█ 第四个参数,FLOAT类型的Length,表示我们创建的柱体沿Z轴的长度。

█ 第五个参数,UINT类型的Slices,表示柱体的外围有几个面,举个例子,如果设为8的话,我们创建的就是八角柱了。

█ 第六个参数,UINT类型的Stacks,表示柱体的两端间共有几段,这个后面光照效果的时候需要要用到的。

█ 第七个参数,LPD3DXMESH类型的*ppMesh,一个存储着我们创建的形状的指针的地址,也就是绘制用D3DXCreateCylinder函数创建的网格的金钥匙,后面需要绘制我们用这个函数创建的柱体网格的话,拿这个指针指一下DrawSubset方法,也就是这样写g_Cylinder->DrawSubset(0);

 █ 第八个参数,LPD3DXBUFFER类型的*ppAdjacency,它存储着我们在这里绘制的网格的三角形索引的指针,我们不用他的话,设为0就可以了。

 

 

 

3. 2D 多边形的创建——D3DXCreatePolygon方法

D3DXCreatePolygon方法用于快速创建一个2D多边形。

 

HRESULT  D3DXCreatePolygon(  __in   LPDIRECT3DDEVICE9 pDevice,  __in   FLOAT Length,  __in   UINT Sides,  __out  LPD3DXMESH *ppMesh,  __out  LPD3DXBUFFER *ppAdjacency);

█ 第一个参数,LPDIRECT3DDEVICE9类型的pDevice,指向IDirect3DDevice9接口的指针,这样一般就填我们在初始化四步曲里面创建的有效的Direct3D绘制”金钥匙”——Direct3D设备对象g_pd3dDevice。表示Direct3D设备对象和我们创建的这个2D 多边形网格之间关联起来了。

█ 第二个参数,UINT类型的Sides,表示我们创建的多边形每条边的长度。

█ 第三个参数,FLOAT Radius2, 表示我们创建的多边形的包含几个三角形。

█ 第四个参数,LPD3DXMESH类型的*ppMesh,一个存储着我们创建的形状的指针的地址,也就是绘制用D3DXCreateCylinder函数创建的网格的金钥匙,后面需要绘制我们用这个函数创建的2D多边形网格的话,拿这个指针指一下DrawSubset方法,也就是这样写g_Polygon->DrawSubset(0);

 

█ 第五个参数,LPD3DXBUFFER类型的*ppAdjacency,它存储着我们在这里绘制的网格的三角形索引的指针,我们不用他的话,设为0就可以了。

 

下面是一个调用实例

 

//用此函数产生一个2D 多边体         ID3DXMesh* meshPolygon;         D3DXCreatePolygon(                             g_pd3dDevice, //D3D绘制对象                            2.0f//每条边的长度                            6, //包含几个三角形                            &meshPolygon,                            0 //通常设置成0(或NULL)                            );         g_pd3dDevice->BeginScene();         meshPolygon->DrawSubset(0);

 


 

4. 球面体创建——D3DXCreateSphere方法

D3DXCreateSphere方法用于创建一个球面体。

 

HRESULT  D3DXCreateSphere(  __in   LPDIRECT3DDEVICE9 pDevice,  __in   FLOAT Radius,  __in   UINT Slices,  __in   UINT Stacks,  __out  LPD3DXMESH *ppMesh,  __out  LPD3DXBUFFER *ppAdjacency);

 

█ 第一个参数,LPDIRECT3DDEVICE9类型的pDevice,指向IDirect3DDevice9接口的指针,这样一般就填我们在初始化四步曲里面创建的有效的Direct3D绘制”金钥匙”——Direct3D设备对象g_pd3dDevice。表示Direct3D设备对象和我们创建的这个2D 多边形网格之间关联起来了。(浅墨在这里是复制粘贴上面的介绍,因为这个参数在本篇文章里介绍的几个创建几何体函数中都是一样的)

█ 第二个参数,UINT类型的Sides,表示我们创建的多边形每条边的长度。

█ 第三个参数,UINT类型的Slices, 表示我们创建的球面体绕主轴线切片数,也就是用几条经线来进行绘制。

█ 第四个参数,UINT类型的Stacks,表示我们创建的球面体绕主轴线的纬线数,也就是用几条纬线来进行绘制。

█ 第五个参数,LPD3DXMESH类型的*ppMesh,一个存储着我们创建的形状的指针的地址,也就是绘制用D3DXCreateCylinder函数创建的网格的金钥匙,后面需要绘制我们用这个函数创建的球面体网格的话,拿这个指针指一下DrawSubset方法,也就是这样写g_Polygon->DrawSubset(0);

█ 第六个参数,LPD

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
不错的dx11入门教程 Tutorial 1: Setting up DirectX 11 with Visual Studio Tutorial 2: Creating a Framework and Window Tutorial 3: Initializing DirectX 11 Tutorial 4: Buffers, Shaders, and HLSL Tutorial 5: Texturing Tutorial 6: Diffuse Lighting Tutorial 7: 3D Model Rendering Tutorial 8: Loading Maya 2011 Models Tutorial 9: Ambient Lighting Tutorial 10: Specular Lighting Tutorial 11: 2D Rendering Tutorial 12: Font Engine Tutorial 13: Direct Input Tutorial 14: Direct Sound Tutorial 15: FPS, CPU Usage, and Timers Tutorial 16: Frustum Culling Tutorial 17: Multitexturing and Texture Arrays Tutorial 18: Light Maps Tutorial 19: Alpha Mapping Tutorial 20: Bump Mapping Tutorial 21: Specular Mapping Tutorial 22: Render to Texture Tutorial 23: Fog Tutorial 24: Clipping Planes Tutorial 25: Texture Translation Tutorial 26: Transparency Tutorial 27: Reflection Tutorial 28: Screen Fades Tutorial 29: Water Tutorial 30: Multiple Point Lights Tutorial 31: 3D Sound Tutorial 32: Glass and Ice Tutorial 33: Fire Tutorial 34: Billboarding Tutorial 35: Depth Buffer Tutorial 36: Blur Tutorial 37: Coming Soon... DirectX 10 Tutorials: Tutorial 1: Setting up DirectX 10 with Visual Studio Tutorial 2: Creating a Framework and Window Tutorial 3: Initializing DirectX 10 Tutorial 4: Buffers, Shaders, and HLSL Tutorial 5: Texturing Tutorial 6: Diffuse Lighting Tutorial 7: 3D Model Rendering Tutorial 8: Loading Maya 2011 Models Tutorial 9: Ambient Lighting Tutorial 10: Specular Lighting Tutorial 11: 2D Rendering Tutorial 12: Font Engine Tutorial 13: Direct Input Tutorial 14: Direct Sound Tutorial 15: FPS, CPU Usage, and Timers Tutorial 16: Frustum Culling Tutorial 17: Multitexturing and Texture Arrays Tutorial 18: Light Maps Tutorial 19: Alpha Mapping Tutorial 20: Bump Mapping Tutorial 21: Specular Mapping Tutorial 22: Render to Texture Tutorial 23: Fog Tutorial 24: Clipping Planes Tutorial 25: Texture Translation Tutorial 26: Transparency Tutorial 27: Reflection Tutorial 28: Screen Fades Tutorial 29: Water Tutorial 30: Multiple Point Lights Tutorial 31: 3D Sound Tutorial 32: Glass and Ice Tutorial 33: Fire Tutorial 34: Billboarding Tutorial 35: Depth Buffer Tutorial 36: Blur Tutorial 37: Coming Soon... DirectX 10 Terrain Tutorials: Tutorial 1: Grid and Camera Movement Tutorial 2: Height Maps Tutorial 3: Terrain Lighting Tutorial 4: Terrain Texturing Tutorial 5: Color Mapped Terrain Tutorial 6: Quad Trees Tutorial 7: Coming Soon... 。。。。。。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值