绘制D基本形状

上传人:206****923 文档编号:37643087 上传时间:2018-04-20 格式:DOC 页数:41 大小:1.12MB
返回 下载 相关 举报
绘制D基本形状_第1页
第1页 / 共41页
绘制D基本形状_第2页
第2页 / 共41页
绘制D基本形状_第3页
第3页 / 共41页
绘制D基本形状_第4页
第4页 / 共41页
绘制D基本形状_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《绘制D基本形状》由会员分享,可在线阅读,更多相关《绘制D基本形状(41页珍藏版)》请在金锄头文库上搜索。

1、6. 6. 绘制绘制 3D3D 基本形状基本形状现在您已学到了如何以 Microsoft Direct3D 立即模式来建立 3D 环境,整个迷宫只剩下最后一个关键片段:建立一个 3D 对象并绘制出来。在第五章中,您看到了 Direct3D 中的所有可用顶点。您也看到了如何自行为顶点配置内存或自行使用顶点缓冲区去管理内存。在本章中,您可以用这些顶点来建立 3D 基本形状(3D primitive)。所谓 3D 基本形状是指由一群顶点组成的对象。您所能建立的最基本形状是一个点串行(point list),它只是一些单一像素点的集合。您也可以建立并绘制一个线串行(line list),这是一个单像素

2、宽线条的集合。然而您所建立的通常是三角形。Direct3D 使用三角形(而非其它种多边形)来描述 3D 对象的各个面,因为三角形是共平面且是凸面形状(意谓他们比较容易快速绘制)。Direct3D 让您可以结合三角形来建立更复杂的多边形和网格。如果运用大量的三角形时,您还可以达到逼近弧面(如球体)的效果。BeginScene 和和 EndScene 方法方法在进入绘制基本形状的细节之前,您应该要了解 BeginScene 和 EndScene。在 Direct3D中,您可以用 IDirect3DDevice7:BeginScene 方法来表示要开始绘制某个场景。这个方法会告诉 DirectX 检

3、查绘制数据和确定成像绘图页已经设定好了。一旦使用该方法后,您可以开始用 Direct3D 方法来绘制场景中的对象所需的基本形状。如果您在呼叫 BeginScene 前呼叫这些方法,Direct3D 会传回D3DERR_SCENE_NOT_IN_SCENE。一旦您的绘制工作告一段落。您必须去呼叫IDirect3DDevice7:EndScene 来清除内部旗标(表示场景绘制进行中),更新快取数据,确定成像绘图页已完成。您必须以 BeginScene/EndScene 组合把所有的对绘制方法的呼叫包起来。如果BeginScene 失败了,场景就不会开始,而且呼叫 Endscene 也会失败(因为一

4、开始就没有启动场景)。如果在呼叫 BeginScene 前某个绘图页没有回复,则它会传回DDERR_SURFACELOST。如果绘图页在绘制过程中不见了, EndScene 也会传回此错误值,而在呼叫绘制方法时也回传回错误。注意一旦 BeginScene 成功之后,如果在场景绘制过程中传回了错误,您必须去呼叫 EndScene 来完成您的绘制过程。记住一件重要的事,您必须先结束一个场景的绘制作业,才能再开始另外一个。如果您试着要使用巢状 BeginScene/EndScene 组合,就会传回 D3DERR_SCENE_IN_SCENE 错误。如果您呼叫了 EndScene 但没有呼叫 Begi

5、nScene,也会有这种错误。索引和非索引的基本形状索引和非索引的基本形状立即模式提供了二种将基本形状顶点分类的方式:使用非索引基本形状和使用索引基本形状。要建立一个非索引基本形状,您可以用有顺序的顶点序列填入数组中。这里的顺序是指由数组中顶点顺序指示如何产生三角形。第一个三角形是由数组中的前三个顶点所组成,第二个三角形是由接下来三个点所组成,依此类推。这意谓着多个三角形不能共享顶点。如果您有二个相连的三角形,您必须要定义同一个顶点很多次。要建立一个索引基本形状,你可以用没有顺序的顶点序列填入数组中。并且建立第二个数组,并且用一个有顺序的索引序列指向这个无顺序的数组中。对索引基本形状而言,数组

6、中的顶点顺序并不重要。而是由索引数组中的索引顺序指示如何造出三角形。第一个三角形是由索引数组中的前三个索引所参照的顶点所组成,第二个三角形是由接下来三个索引所参照的顶点所组成,依此类推。这意谓着多个三角形可以共享顶点,只要让索引数组中的多个项目参照到同一个顶点即可。本章稍后会谈到的三角条(strip)和扇,也是可以共享顶点,所以您应该依据 3D 对象的结构来选择使用索引或非索引基本形状。大部分的 3D 模型分享多个顶点。因此,您可以让多个三角形间(或线条)分享这些顶点来节省内存、频宽以及 CPU 时间。当 3D 模型分享顶点时,索引顶点是很有用的。然而要小心某些看起来可以共享,事实却不然的顶点

7、。立方体就是个典型的例子。让构成立方体的12 个三角形只须共享 8 个顶点,看起来很诱人。但是如果您这样做,就会在这些点的法向量出问题。每个三角形的面都有一个向量,称为表面法向量(face normal),和平面垂直。这个表面法向量指向远离三角形面的前方边缘,在 Direct3D 中这是唯一可见边。因为法向量是依顶点而非面来定义,二个不同法向量的三角形就不能共享顶点。即使他们可以,但是被共享的顶点只能有一个法向量,所以就无法产生您想得到的打光效果。在立方体的情况中,事实上使用 24 个顶点会比较好,甚至比 12 个三角形所必须的 36 个顶点(不用索引时)还要好。图 6-1 说明了这些法向量的

8、组成。图 6-1 一个立方体表面的顶点法向量DrawPrimitive 方法方法您可能开始觉得在绘制基本形状时有许多不同的情况要考虑。您已经学到顶点有三种储存方式:使用者数组、间插顶点和顶点缓冲区。而且您已学到 Direct3D 可以绘制三种基本形状:点、线和三角形。线可以分成二种:线串行(line list)和线条块。三角形可以区分成三种:串行、条块和扇。最后,基本形状可以是索引或非索引的。如此一来,又增加了绘制基本形状时的许多不同方式!IDirect3DDevice7 接口的 6 种 DrawPrimitive 方法可以处理所有的情况。表 6-1 说明了针对各种顶点型态和索引型态组合所适用

9、的不同方法。表表 6-1 绘制基本形状的方法绘制基本形状的方法 基本形状的型态基本形状的型态 一般的使用者顶点一般的使用者顶点 间插的使用者顶点间插的使用者顶点 顶点缓冲区顶点缓冲区非索引DrawPrimitiveDrawPrimitiveStridedDrawPrimitiveVB索引DrawIndexedPrimitive DrawIndexedPrimitiveStrided DrawIndexedPrimitiveVB让我们再详细看看这些方法DrawPrimitiveIDirect3DDevice7:DrawPrimitive 方法会依您所提供作为任意几何基本形状类型的顶点数组来绘制。

10、以下是本方法的函式宣告:HRESULT IDirect3DDevice7:DrawPrimitive(D3DPRIMITIVETYPE dptPrimitiveType,DWORD dwVertexTypeDesc,LPVOID lpvVertices,DWORD dwVertexCount,DWORD dwFlags);参数参数 说明说明dptPrimitiveType这个指令所要绘制的基本形状型态。这个基本形状型态必须是 D3DPRIMITIVE 列举型态的成员之一。dwVertexTypeDesc储存弹性顶点格式旗标的组合,用来定义这些基本形状集合会用到的顶点格式。lpvVertices

11、指到在基本形状序列中用到的顶点数组的指针。dwVertexCount储存了数组中画出的顶点数目。您可以指定的最大值是 D3DMAXNUMVERTICES(65,535)。dwFlags将本参数设为 0 可在绘制基本形状时不用等待,如果设为 D3DDP_WAIT,则使得方法会在回传前保持等待,直到多边形 完成绘制。预设情形下,这个方法会在将多边形传送到视讯卡后立刻回传。 可利用 D3DDP_WAIT 旗标值来除错。程序不应在绘制前使用 D3DDP_WAIT 旗标来等待场景更新。DrawPrimitiveStridedIDirect3DDevice7:DrawPrimitiveStrided 方法

12、是用间插顶点数组绘出多个几何形状。您必须检查想绘制的顶点是否使用了所指定的格式。因为 Direct3D 不会检查顶点大小和间插是否符合已设定的弹性顶点格式,您必须自行确认,否则就可能发生内存错误。这里是方法的函式宣告:HRESULT DrawPrimitiveStrided(D3DPRIMITIVETYPE dptPrimitiveType,DWORD dwVertexTypeDesc,LPD3DDRAWPRIMITIVESTRIDEDDATA lpVertexArray,DWORD dwVertexCount,DWORD dwFlags);参数参数 说明说明dptPrimitiveType这

13、个指令要绘制的基本形状型态。这个参数必须是 D3DPRIMITIVETYPE 列举型态成员之一。dwVertexTypeDesc 描述顶点格式的弹性顶点格式旗标的组合。lpVertexArrayD3DDRAWPRIMITIVESTRIDEDDATA 结构的地址,这个结构中 包含了基本形状的顶点组件指针和内存间插值,这个参数的格 式是由dwVertexTypeDesc 中的旗标所设定。dwVertexCountlpVertexArray 数组中的顶点数目。可容许的最大顶点数是D3DMAXNUMVERTICES(0xFFFF)。dwFlags设为 0 可在绘制基本形状时不用等待,如果使用 D3DD

14、P_WAIT 旗标,则使得方法会在回传前保持等待,直到多边形完成绘制, 而不会在多边形传送到视讯卡后立刻回传。(对场景撷取卡而言,当卡响应时方法会立刻回传。) 本旗标值通常是来除错。程序不应用 D3DDP_WAIT 旗标来等待 场景更新后再继续。DrawPrimitiveVBIDirect3DDevice7:DrawPrimitiveVB 方法是用顶点缓冲区的顶点数组绘出多个几何基本形状。这里是方法的函式宣告:HRESULT DrawPrimitiveVB(D3DPRIMITIVETYPE d3dptPrimitiveType ,LPDIRECT3DVERTEXBUFFER7 lpd3dVer

15、texBuffer,DWORD dwStartVertex ,DWORD dwNumVertices ,DWORD dwFlags);参数参数 说明说明pptPrimitiveType这个指令要绘制的基本形状型态。这个参数必须是 D3DPRIMITIVETYPE 列举型态成员之一。lpd3dVertexBuffer包含了顶点数组的顶点缓冲区的 IDirect3DVertexBuffer7 接口地址。顶点可以是已转换或未转换,最佳化或未最佳化。dwStartVertex在基本形状中的第一个顶点的索引值。最大可能启始索引是D3DMAXNUMVERTICES(0xFFFF)。在除错过程中,如果指定

16、一个超过此极值的启始索引值时,会造成方法失败且传回 DDERR_INVALIDPARAMS。dwNumVertices绘制的顶点数。可容许的最大顶点数是 D3DMAXNUMVERTICES (0xFFFF)。dwFlags设为 0 可在绘制基本形状时不用等待,如果使用 D3DDP_WAIT 旗标,则使得方法会在回传前保持等待,直到多边形完成绘制, 而不会在多边形传送到视讯卡后立刻回传。(对场景撷取卡而 言,当卡响应时方法会立刻回传。) 本旗标值通常是来除错。程序不应用 D3DDP_WAIT 旗标来等待 场景更新后再继续。DrawIndexedPrimitiveIDirect3DDevice7:DrawIndexedPrimitive 方法在绘制指定的几何基本形状时,会依据对顶点数组所作的索引而非直接使用某个顶点数组。以下是本方法的函式宣告:HRESULT IDirect3DDevice7:DrawIndexedPrimitive(D3DPRIMITIVETYPE d3dptPrimitiveType ,DWORD dwVertexTypeDesc,

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

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

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