- 1、本文档共41页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
.绘制 D基本形状
6. 绘制 3D基本形状
现在您已学到了如何以Microsoft Direct3D立即模式来建立3D环境,整个迷宫只剩下最后一个关键片段:建立一个3D对象并绘制出来。在第五章中,您看到了Direct3D中的所有可用顶点。您也看到了如何自行为顶点配置内存或自行使用顶点缓冲区去管理内存。在本章中,您可以用这些顶点来建立3D基本形状(3D primitive)。
所谓3D基本形状是指由一群顶点组成的对象。您所能建立的最基本形状是一个点串行(point list),它只是一些单一像素点的集合。您也可以建立并绘制一个线串行(line list),这是一个单像素宽线条的集合。然而您所建立的通常是三角形。Direct3D使用三角形(而非其它种多边形)来描述3D对象的各个面,因为三角形是共平面且是凸面形状(意谓他们比较容易快速绘制)。Direct3D让您可以结合三角形来建立更复杂的多边形和网格。如果运用大量的三角形时,您还可以达到逼近弧面(如球体)的效果。
BeginScene和EndScene方法
在进入绘制基本形状的细节之前,您应该要了解BeginScene和EndScene。在Direct3D中,您可以用IDirect3DDevice7::BeginScene方法来表示要开始绘制某个场景。这个方法会告诉DirectX检查绘制数据和确定成像绘图页已经设定好了。
一旦使用该方法后,您可以开始用Direct3D方法来绘制场景中的对象所需的基本形状。如果您在呼叫BeginScene前呼叫这些方法,Direct3D会传回D3DERR_SCENE_NOT_IN_SCENE。一旦您的绘制工作告一段落。您必须去呼叫IDirect3DDevice7::EndScene来清除内部旗标(表示场景绘制进行中),更新快取数据,确定成像绘图页已完成。
您必须以BeginScene/EndScene组合把所有的对绘制方法的呼叫包起来。如果BeginScene失败了,场景就不会开始,而且呼叫Endscene也会失败(因为一开始就没有启动场景)。如果在呼叫BeginScene前某个绘图页没有回复,则它会传回DDERR_SURFACELOST。如果绘图页在绘制过程中不见了, EndScene也会传回此错误值,而在呼叫绘制方法时也回传回错误。注意一旦BeginScene成功之后,如果在场景绘制过程中传回了错误,您必须去呼叫EndScene来完成您的绘制过程。
记住一件重要的事,您必须先结束一个场景的绘制作业,才能再开始另外一个。如果您试着要使用巢状BeginScene/EndScene组合,就会传回D3DERR_SCENE_IN_SCENE错误。如果您呼叫了EndScene但没有呼叫BeginScene,也会有这种错误。
索引和非索引的基本形状
立即模式提供了二种将基本形状顶点分类的方式:使用非索引基本形状和使用索引基本形状。要建立一个非索引基本形状,您可以用有顺序的顶点序列填入数组中。这里的顺序是指由数组中顶点顺序指示如何产生三角形。第一个三角形是由数组中的前三个顶点所组成,第二个三角形是由接下来三个点所组成,依此类推。这意谓着多个三角形不能共享顶点。如果您有二个相连的三角形,您必须要定义同一个顶点很多次。要建立一个索引基本形状,你可以用没有顺序的顶点序列填入数组中。并且建立第二个数组,并且用一个有顺序的索引序列指向这个无顺序的数组中。对索引基本形状而言,数组中的顶点顺序并不重要。而是由索引数组中的索引顺序指示如何造出三角形。第一个三角形是由索引数组中的前三个索引所参照的顶点所组成,第二个三角形是由接下来三个索引所参照的顶点所组成,依此类推。这意谓着多个三角形可以共享顶点,只要让索引数组中的多个项目参照到同一个顶点即可。本章稍后会谈到的三角条(strip)和扇,也是可以共享顶点,所以您应该依据3D对象的结构来选择使用索引或非索引基本形状。
大部分的3D模型分享多个顶点。因此,您可以让多个三角形间(或线条)分享这些顶点来节省内存、频宽以及CPU时间。当3D模型分享顶点时,索引顶点是很有用的。然而要小心某些看起来可以共享,事实却不然的顶点。立方体就是个典型的例子。让构成立方体的12个三角形只须共享8个顶点,看起来很诱人。但是如果您这样做,就会在这些点的法向量出问题。每个三角形的面都有一个向量,称为表面法向量(face normal),和平面垂直。这个表面法向量指向远离三角形面的前方边缘,在Direct3D中这是唯一可见边。因为法向量是依顶点而非面来定义,二个不同法向量的三角形就不能共享顶点。即使他们可以,但是被共享的顶点只能有一个法向量,所以就无法产生您想得到的打光效果。在立方体的情况中,事实上使用24个顶点会比较好,甚至比12个三角形所必须的36个顶点(不用索引时)
文档评论(0)