首页 > > > Direct3D中的2D编程(中文版).pdf

Direct3D中的2D编程(中文版).pdf

Direct3D中的2D编程(中文版).pdf

上传者: 绝命336 2012-01-06 评分1 评论1 下载407 收藏10 阅读量1098 暂无简介 简介 举报

简介:本文档为《Direct3D中的2D编程(中文版)pdf》,可适用于赤壁领域,主题内容包含DirectD中的D编程美ErnestPazera著黄际洲文俊浩译重庆大学出版社ErnestPazeraFocusonDinDirectDISBN:符等。

Direct3D中的2D编程[美]ErnestPazera著黄际洲文俊浩译重庆大学出版社ErnestPazeraFocuson2DinDirect3DISBN:1-931841-10-1Copyright?2002byPremierPress,adivisionofThomsonLearning.OriginallanguagepublishedbyThomsonLearning.AllRightsreserved.本书原版由汤姆森学习出版集团出版。版权所有,盗印必究。ChongqingUniversityPressisauthorizedbyThomsonLearningtopublishanddistributeexclusivelythissimplifiedChineseedition.ThiseditionisauthorizedforsaleinthePeople’sRepublicofChinaonly(excludingHongKong,MacaoSARandTaiwan).UnauthorizedexportofthiseditionisaviolationoftheCopyrightAct.Nopartofthispublicationmaybere-producedordistributedbyanymeans,orstoredinadatabaseorretrievalsystem,withoutthepriorwrittenpermissionofthepublisher.本书中文简体字翻译版由汤姆森学习出版集团授权重庆大学出版社独家出版发行。此版本仅限在中华人民共和国境内(不包括中国香港、澳门特别行政区及中国台湾)销售。未经授权的本书出口将被视为违反版权法的行为。未经出版者预先书面许可,不得以任何方式复制或发行本书的任何部分。981-265-260-4版贸核渝字(2004)第37号图书在版编目(CIP)数据Direct3D中的2D编程/(美)帕泽拉(Pazera,E.)著;黄际洲,文俊浩译.—重庆:重庆大学出版社,2005.1(Premier游戏系列丛书)ISBN7-5624-3294-5Ⅰ.D...Ⅱ.帕...黄...文...Ⅲ.多媒体—软件工具,DirectⅣ.TP311.56中国版本图书馆CIP数据核字(2004)第129437号Direct3D中的2D编程Direct3DZhongde2DBiancheng[美]ErnestPazera(帕泽拉)著黄际洲文俊浩译出版者:重庆大学出版社社址:重庆市沙坪坝正街174号重庆大学(A区)内网址:http://www.cqup.com.cn邮编:400030电话:(023)6510237865105781传真:(023)6510368665105565出版人:张鸽盛责任编辑:袁江权国政版式设计:袁江责任校对:邹忌责任印制:秦梅印刷者:重庆升光电力印务有限公司印刷发行者:全国新华书店经销开本:78710921/16印张:15.75字数:324千版次:2005年1月第1版2005年1月第1次印刷书号:ISBN7-5624-3294-5印数:1—3000定价:35.00元致谢致Emi和Estelle,谢谢你们的理解和耐心的支持,谢谢你们没有因书的晚到而不喜欢我。致JohnHattan,这是你应得到的一个感谢。本书是一群人合力协作的结果,由于人太多,在此不能一一提及。但是我还是要指出那些我记得的人的名字,对于那些不小心被我遗忘的人(或者我根本就不知道却在默默奉献的人),敬请原谅。首先感谢AndréLaMothe,他赞成将2D融入3D书内,才使得本书得以出版。其次,感谢两位可爱的、聪明能干的、辛勤奉献的女性:EmiSmith和EstelleManticas———我的编辑。另外感谢我的技术顾问LorenzoD.Phillips,他是一个优秀的全能人才,给了我极大的帮助,希望我没有使他失望。还要感谢:DaveAstle、MasonMcCuskey、KevinHawkins、JohnHattan、RonPenton以及所有那些我经常通过互联网联系的人们。其他所有的人们,谢谢你们。确实是所有的人,地球上所有的同胞(活着的、已经去世的以及那些尚未出生的婴儿),这样,我就不会遗漏任何一个人了。丛书编辑寄语在1995年左右,我出席了微软总部的一个代号为“宣判日”的活动。这个活动主要是告诉开发者,或者应该说是奉劝开发者,DOS时代已经过去了,DirectX到来了。一些开发者对它表示怀疑———许多人在使用WinG之前曾经信任过微软,如果现在询问微软有关WinG的技术,微软就会矢口否认它的存在。无论如何,微软这次是对的:DOS时代已经过去了,DirectX到来了。DirectX对游戏编程、图形以及多媒体世界产生了巨大的影响。但这个转变过程并不容易,事实上,直到DirectX3.0出现之后,大多数游戏开发者才开始转向DirectX,摒弃了DOS4G和32位平面模式的DOS游戏编程。如今,市面上讲述DirectX的书非常多,上万的开发人员在为DirectX编写代码,以DirectX为基础,创建有着千万行代码规模的软件。最近,微软决定从DirectX8.0版本中完全去除DirectDraw。听到这个消息时,我几乎快得心脏病了。确实,我们可以一直使用7.0版本的接口和DirectDraw,那么微软为什么要这样做呢?简而言之就是微软想整合大量的DirectX组件,创建一个新的、清晰的DirectXGraphics和DirectXAudio系统。这是一个伟大的构想,但是,微软本来可以继续使用DirectDraw,为什么却没有呢?不要因此而哭泣。你或许会问:有什么损失呢?你必须使用3D接口来完成所有的2D图形处理———听起来相当愚蠢,不是吗?好像的确是这样,但是,只要多一点耐心,使用很少的代码,就可以使用Direct3D的新接口完成2D图形处理,另外,还可以得到各种各样非常卓越的效果,例如缩放、旋转、透明以及光照等。基本上,可以像渲染平面多边形一样渲染2D图像和精灵,对多边形进行的所有操作,对这种新的“3D精灵”也都适应。为了帮助你渡过这个痛苦的过渡阶段,Mr.Pazera编写了这本优秀的作品。本书告诉读者如何使用新的DirectX8.0接口,来创建2D精灵以及使用这些精灵创建3D效果。在本书中,将会学习IDirect3D8,这个新接口是使用Direct3D的关键,还将Ⅰ学习如何创建表面和纹理,以及如何使用Direct3D硬件加速操作和变换这些对象。在讲解完必要的2D基础知识后,本书将转向讲述一些3D概念,帮助你在2D游戏作品中加入3D性能。最后,本书后面有多个游戏编程示例,说明如何创建卷轴视角(scrolling)游戏、俯视视角(topdownview)游戏、斜视角(ISOmetric)游戏等等。本书不是一本应该收藏在图书室里的书,而是一本必须收藏在图书室里的书!对于某些比较难实现的东西,读者不必再去费力尝试,因为它们已经被Pazera先生经过痛苦的尝试之后研究出来了,这本书是他辛苦劳动的结晶,以一种读者容易吸收的方式呈现在你面前,书中的知识可以立即在游戏中得以运用。诚挚的AndréLaMotheSeriesEditorⅡ介绍欢迎阅读本书。我由衷地希望你能够喜欢本书。为了此书的出版,我和许多人(许多人我都没有见过面而且我希望能够见到他们)曾进行了长时间的努力。如果你已经直接跳到了第一章,可能就会发现我直接进入了正题,而不是先用数百页的篇幅来讲述基本的Windows编程以及基本的DirectX信息。Focuson系列丛书都是采用直接讲述主题的方法。原因同读者的抱怨有关,我的上本书IsometricGameProgrammingwithDirectX7.0,读者抱怨最多的是:(a)书的价钱太高;(b)WIN32/DirectX教程占用了全书整整三分之一的篇幅。因为WIN32/DirectX部分占用了整整250页,这本书的篇幅就膨胀到了700多页。书的页码越多,印刷所需的费用也就越高,并且费用也最终会落到消费者的头上(这就是商业的本质)。基于以上原因,本书就没有包含基础部分。目前市面上有非常多的书讲述基本WIN32/DirectX的知识(说不定你手头上就有一本),因此本书就不再进行这方面的讲述了。但是,因为本书没有讲述基础知识,要想从本书中学有所获,你应该对游戏编程知识有一定的了解(需要什么程度的了解,请参考下面“本书面向的阅读对象”部分)。本书讲述的内容本书主要讲述Direct3D,它是DirectX的一个组件,主要用于渲染三维场景(或至少粗略地逼进三维)。但是,和其他的Direct3D书不同,本书并没有实际讲述在传统场景中的3D渲染,而是讲述2D渲染,对Direct3D的主题而言,2D渲染是一种非常难的方法。本书将竭力讲述一些API的实际使用方法,而不是讲述如何按照这些API的原本设计意图进行使用。虽然二者的差别很细微,但却至关重要。在本书中,绝大部分内容都只起一个桥梁的作用。虽然2D游戏还有生存空间(并且一直都有,不是所有的游戏都需要3D),但空间却在不断缩减。那么本书提供的桥梁通往何处?读完本书,就能更好地领会Direct3D的内幕,当再次阅读以前让你如坠云里雾中的Direct3D书时,就会感到更容易了。Ⅰ本书面向的阅读对象如果你是一个2D程序员,就应该非常熟悉某些2DAPI,比如GDI、DirectDraw、SDL等,重要的是,你应该很好地掌握2D游戏编程所用到的各种技巧。当然,这只表明你是一个游戏程序员,比所有新手的平均水平要高出一些,但你不一定通晓全部。最理想的情况就是,你是一个2D游戏程序员,没有找到/买到/读不懂一本或者多本Direct3D方面的书,总是无法理解并掌握Direct3D,所有和Direct3D相关的书和/或所有互联网上的教程,你都无法很好地理解,即使主题是用Direct3D进行2D编程,但是这些书都是从3D程序员的角度进行书写的,而不是从一个2D程序员的角度。本书所使用的程序设计语言是C++,并且使用了某些C++的特性,但本书的绝大部分要求你对C语言的知识有一个好的掌握。关于作者ErnestPazera的兴趣非常广泛,他写书(这本书是他的第三个作品)、开发游戏以及其他各类软件,为GameDev.net编写网页脚本,在他的家乡Wisconsin的Kenosha经营了一家商店;空闲时,他喜欢看科幻小说,玩各种游戏(不只限于计算机游戏),最近几个月,他迷上了葡萄柚汁。Ⅱ译者序2001年,在听到微软决定从DirectX的8.0版本中完全去除DirectDraw的消息时,我几乎不敢相信自己的耳朵,因为这意味着从此之后必须使用3D接口来完成所有的2D图形处理。在由DirectDraw向Direct3D过渡时,不少2D程序员深感此过程的痛苦,因为市面上所有和Direct3D相关的书或互联网上的教程,都是从3D程序员的角度进行书写的,而不是从一个2D程序员的角度,这也给读者的理解增加了不少困难。的确,在和朋友们进行交流的时候,他们也常谈到由于该类书籍的缺乏带来许多学习上的不便。因此,寻找一本好的2D编程书籍成了我用心关注的一个问题。转眼间时至2004年夏,当重庆大学出版社的社长助理陈晓阳询问我是否有兴趣翻译由Premier出版社出版的这本有关2D游戏编程的书籍时,我意识到这本书如若能成功翻译,将无疑会成为广大2D游戏程序员的福音,于我本人,也达成了自己的心愿。因此,尽管犹豫数番,我还是选择了冒失受命,兢兢业业、夜以继日地完成了译稿工作。本书是原著者数本广受读者欢迎的游戏编程书籍之一。细心的读者可能会发现,本书略去了WIN32/DirectX部分的讲述(一来降低了书的价格,二来在于市面上专门讲述WIN32/DirectX知识的书籍已经非常之多),开篇即直奔主题,由浅入深地从2D游戏编程知识逐渐向有关3D游戏编程的知识进行讲述,还不断对二者进行了穿插讲述。本书的前半部分主要讲述如何使用Direct3D来实现使用DirectDraw所能实现的功能,详细解释了诸如顶点缓冲、纹理等基本概念,并切实解答了如何创建多重纹理、如何用顶点缓冲渲染图元等问题;后半部分开始逐步介绍3D相关的知识,从读者角度考虑,用易于理解的方式详细讲述了诸如Z缓冲、alpha混合、光照、X文件、粒子系统等较高级的主题。这两部分知识的结合为读者从2D世界跨越到3D世界搭设了一道桥梁,使读者在阅读完本书后,能彻悟Direct3D的知识,因此也就能在阅读其他难度更高的Direct3D书时,感到更轻松一些。因此,在翻译该书的过程中,我感到,对2D游戏程序员来说,这是一本知识详尽且有较强实用性的游戏编程书籍,并且凭借自身的体验及了解,我也向大家推荐这本不可多得的好书。在翻译本书的过程中,我也历经了必然的喜悦与忧愁。喜的是有幸如此深入地研读域外大家之作,拓宽视野,使自己在游戏编程方面更进了一步;忧的是翻译过程中,既要体味Ⅰ原作者的思想本质,又要把握他们的语言风格,还要用国人习惯的表达方式陈述出来,实非易事。由于译者水平所限,不当之处难免,敬请读者惠赐批评。请致电邮:jizhouhuang@cqu.edu.cn。最后,我要深深感谢我的导师杨丹教授和文俊浩副教授,导师的宽容、鼓励和中肯的批评给了我无尽的教益和启迪,而他们为我创建的充满希望、进取精神的环境促进了这本书的早日译成。同时,我特别感谢重庆大学出版社的社长助理陈晓阳以及袁江等编辑,是他们给了我这样一个不可多得的学习机会。社长助理陈晓阳的大力支持、无私指导,令我难以忘怀;而袁江以及其他参与此书编辑审核的老师们踏实负责、肯干的态度也极大鞭策了我。本书能够尽快译完付梓,是那些一直寄予我关心而我在此无法一一述及的所有师友的信念激励的结果。对他们的莫大帮助,在此诚谨致谢!黄际洲2004年12月10日于重庆大学校园Ⅱ目录第1部分从DirectDraw7.0到Direct3D8.0第1章初始化Direct3D31.1初始化步骤41.2IDirect3D8对象的用途51.3创建IDirect3D8对象61.4性能检测71.5显示格式121.6兼容格式检查151.7总结18第2章创建设备192.1创建IDirect3DDevice8对象202.2设置视区242.3Direct3D颜色和清除视区252.4显示场景262.5重置显示模式282.6总结29第3章顶点格式313.1Direct3D的用途323.2表示顶点数据333.3变换或者未变换38Ⅰ3.4顶点缓冲383.5索引缓冲423.6总结44第4章渲染图元454.1渲染状态464.2开始和结束一个场景484.3图元类型494.4不使用顶点缓冲来绘制图元514.5带有用户内存指针的索引图元564.6用顶点缓冲绘制图元584.7用索引缓冲渲染索引图元594.8总结60第5章表面615.1资源类型625.2后备缓冲635.3图像表面645.4从一个表面拷贝到另外一个表面655.5加载图像675.6Direct3D光标725.7创建额外的渲染目标755.8总结77第6章纹理796.1创建纹理806.2加载纹理数据826.3纹理坐标826.4应用纹理到图元上836.5纹理寻址模式846.6多重纹理886.7总结91Ⅱ第7章Alpha测试937.1Alpha测试的概述947.2将图像作为纹理进行加载967.3一个图像,多个纹理977.4总结100第2部分Direct3D扩展第8章坐标空间1038.1坐标空间的类型1048.2几何流水线1078.3总结108第9章矢量1099.1矢量定义1109.2D3DVECTOR1119.3矢量加法1129.4矢量减法1139.5缩放矢量1149.6绝对值1149.7方向1159.8标准化1159.9旋转1169.10点乘1179.11叉乘1179.12D3DX矢量函数1189.13总结120第10章矩阵12110.1矩阵概述12210.2矩阵加法12410.3矩阵乘法12510.4平移129Ⅲ10.5矩阵旋转13010.6缩放13110.7D3DMATRIX13210.8D3DXMATRIX13310.9总结135第11章几何流水线13711.1流水线13811.2设置变换14011.3乘以变换矩阵14211.4总结143第12章Z缓冲14512.1Z缓冲的定义14612.2设置Z缓冲14712.3使用Z缓冲15112.4总结152第13章光照15313.1Direct3D光照15413.2D3DMATERIAL815513.3D3DLIGHT815713.4点光源16113.5直射光16313.6聚光灯16313.7环境光16513.8镜面反射光16713.9放射光16913.10总结169第14章Alpha混合17114.1Alpha混合的定义17214.2设置Alpha混合173Ⅳ14.3使用Alpha混合17514.4总结176第3部分综合运用第15章模型17915.1模型的定义18015.2X文件18015.3创建一个简单的X文件加载程序18915.4总结209第16章粒子系统21116.1粒子系统的定义21216.2粒子系统的要素21216.3粒子类型21316.4存储一个粒子系统21516.5粒子的生命周期21616.6渲染粒子22016.7一个粒子系统例子22416.8总结224第17章多边形中的点22517.1三角形中的点22617.2总结228第18章总结22918.1大型游戏在哪里23018.2你学到了什么23018.3何去何从23118.4总结231索引232Ⅴ第1部分从DirectDraw7.0到Direct3D8.0在DirectX7.0面世之前,2D游戏编程员的工作相当容易。从一个版本的API到下一个版本的API,DirectX的DirectDraw部分经历了相对较小的变化。这些变化不是在功能上真正有所改变,而更像是完善。至于DirectX8.0就不再是这种情况了,虽然DirectX7.0还在使用,但它已经显得有些过时,如果想继续编写2D应用程序或者游戏的话,必须使用旧的DirectDraw7.0或者是换用Direct3D8.0。无论如何,换用Direct3D8.0都很有必要。确实,在使你完全沉浸于Direct3D所带给你的一切之前,我将逐渐让你离开DirectDraw7.0。实际上,本书的前半部分都是在讲如何把在DirectDraw里所实现的功能转化成Direct3D的等价形式。本章的主要任务是初步接触IDirect3D8对象。Direct3D8.0中的IDirect3D8对象,等同于DirectDraw7.0中的IDirectDraw7对象。本章的学习目标如下:理解Direct3D8的初始化步骤,以及和在DirectDraw7.0里进行初始化的步骤的区别理解IDirect3D8对象的用途知道如何创建一个IDirect3D8对象知道如何检测一个在系统支持的适配器上的IDirect3D8对象的性能理解Direct3D如何表示显示格式知道如何枚举出适配器的显示模式(displaymode,亦即显示方式,本文使用显示模式)对于一个特定的显示模式,知道如何查找可用的媒体格式1.1初始化步骤在应用程序里初始化DirectDraw时,每次都需要经历几个相同的步骤(有的步骤是可选项)。初始化Direct3D时,同样也是如此。初始化DirectDraw需要进行的步骤如下:枚举显示适配器(adapter)(可选)。创建一个DirectDraw对象。设置IDirectDraw7对象的协作级别。检测IDirectDraw7对象的性能(可选)。4Direct3D中的2D编程第1章?跏蓟疍irect3D枚举显示模式(如果要实现全屏)。选择和设置一个合适的显示模式(如果要实现全屏)。创建主表面和后备缓冲或双缓冲(以适合窗口或全屏)。加载游戏图像到离屏(off-screen)表面以备后用。事实上,如果使用的DirectDraw子集能够兼容所有的视频卡(我倾向于这样做),那么就没有必要检查对象的性能了。并且,如果创建窗口应用程序,就不需要枚举显示模式。具体到Direct3D,也需要经历几个步骤来为需要用到Direct3D的应用程序做准备,许多步骤大体上和初始化DirectDraw是一样的。创建IDirect3D8对象。检查IDirect3D8对象的性能并选择一个合适的设备类型。为适配器选择一个显示适配器和显示模式。创建并初始化IDirect3DDevice8对象。将游戏图像加载到纹理(texture)上。奇怪的是,IDirect3D8对象的初始化居然比IDirectDraw7对象的初始化步骤要少。不过先别高兴,因为根据要实现的功能来创建和初始化IDirect3DDevice8对象可能会相当复杂,原因在于这是在运用Direct3D来开发不同于预期目标的功能,本书提出了一些具有创新意义的观点。本章接下来的部分将着重讲述步骤1~3,使你能够对Direct3D有一个较深入的认识。1.2IDirect3D8对象的用途在DirectDraw7.0里,IDirectDraw7对象相当重要,因为IDirectDraw7对象被当成一个“工厂(factory)”来创建其他的DirectDraw对象,包括表面(surface)、裁剪器(clipper)以及调色板(palette)。IDirect3D8对象和IDirectDraw7对象只有些许相似,但IDirect3D8对象不是用作核心工厂来创建其他的Direct3D对象,它只创建一个IDirect3DDevice8(在第2章将会讲述)对象。IDirect3D8对象的主要用途是用来检查硬件的性能,以便能为游戏选出一个运行效果最佳的设备。由于视频卡(也称显卡)种类繁多,性能也参差不齐,游戏用到的一些特性,可能某些机器上并不支持。这些由于硬件性能而无法体现出来的特性,可以通过软件进行模拟,但是对这些特性的模拟常常会降低游戏的速度,而存在硬件加速的话,游戏就会快很多。对于可预测的将来着想,留下软件模拟还是有必要的。因此,必须重视系统需求,以免失去整整一块游戏玩家。5第1章初始化Direct3D1.3创建IDirect3D8对象从调用Direct3DCreate8函数开始,来初始化DirectX的Direct3D8子系统,Direct3DCreate8函数和DirectDraw中的DirectDrawCreateEx函数十分相似。下面是Direct3DCreate8函数的原型:IDirect3D8*Direct3DCreate8(UINTSDKVersion);Direct3DCreate8函数只有一个参数,通常是常量D3D_SDK_VERSION,返回值是一个指向IDirect3D8对象的指针。下面的一小段代码创建并撤销(destroy)了一个IDirect3D8对象:IDirect3D8*pd3d;//指向IDirect3D8对象的指针pd3d=Direct3DCreate8(D3D_SDK_VERSION;//创建IDirect3D8对象//撤销IDirect3D8对象ifpd3d{pd3d->Release);pd3d=NULL;}图1.1创建第一个IDirect3D8对象图1.2IDirect3D8对象向文件stdout.txt的输出和其他所有的DirectX对象一样,IDirect3D8也是一个COM对象,为了“撤销”IDirect3D8对象,就必须先释放掉他。DirectX的内部引用计数(internalreferencecounting)确保了在不需要DirectX对象的时候将其撤销(译者注:大多数对象当其引用计数降为06Direct3D中的2D编程时,DirectX会自动从内存中释放这个对象。)。创建一个IDirect3D8对象要比调用DirectDrawCreateEx或CoCreateInstance简单多了。范例1.1(在本书附赠的光盘上(X:\Source\Example1_1)有完整的代码)是一个非常简单的例子。这个例子创建了一个简单的窗口,先创建一个IDirect3D8对象,然后将其释放。诊断输出记录在文件stdout.txt中。图1.1显示了应用程序,图1.2显示了向文件stdout.txt写入的诊断记录。1.4性能检测一旦创建了IDirect3D8对象,乏味琐碎的工作就开始了。为了游戏功能的稳定性,必须检查不同的设备类型,大致需要在几种显示适配器上进行检查。检查更像是枚举(枚举的过程就是创建一些东西的列表,具体地说,列举的要么是显示适配器,像视频卡,和/或这些显示适配器的显示模式),但是这种枚举和老的Direct3D版本所使用的枚举并不相同,并且和DirectDraw的枚举也不一样。我一开始进行枚举时遇到了一些小麻烦,因为我已经习惯使用DirectX7.0及其更低版本所通用的枚举回调(callbackenumeration),但是,这个过程并不难。1.4.1适配器首先,讲述如何决定附加哪个显示适配器给系统。由于系统附属的视频卡可能不止一个,所以要考虑这种特殊情况。在DirectDraw里,创建IDirectDraw7对象之前,要使用DirectDrawEnumerate或DirectDrawEnumerateEx函数来列举出可用的显示适配器。而在Direct3D8.0里,是在创建对象之后才枚举出显示适配器。Direct3D8使用3个函数来列举显示适配器,这三个函数是:IDirect3D8::GetAdapterCount,IDirect3D8::GetAdapterMonitor以及IDirect3D8::GetAdapterIdentifier。IDirect3D8::GetAdapterCount函数的原型如下:UINTIDirect3D8::GetAdapterCount);这个函数不带任何参数,返回值类型为UINT(unsignedint,即无符号整型)。函数的返回值为系统可用的显示适配器数量。如果函数的返回值为1,就很好选择,因为只有一个显示适配器可供选择。适配器的编号从0到GetAdapterCount)的结果减1。如果GetAdapterCount函数的返回值是1,仅有的适配器编号就是0;如果返回值是2,可用的显示适配器编号就是0和1,其他的依此类推。默认显示适配器(defaultdisplayadapter)有一个专有值D3DADAPTER_7第1章初始化Direct3DDEFAULT,其值为0,并且默认适配器的编号总是0。得到了显示适配器的编号之后,就可以使用IDirect3D8::GetAdapterIdentifier函数对它们行查看了。GetAdapterIdentifier函数提供了访问有关适配器的重要信息的入口,这些信息是人可识别(human-readable)的。下面是GetAdapterIdentifier函数的原型:HRESULTGetAdapterIdentifierUINTAdapter,DWORDFlags,D3DADAPTER_IDENTIFIER8*pIdentifier);与大多数DirectX函数一样,这个函数的返回类型也是HRESULT,表示函数是否成功执行。这个函数的返回值是D3D_OK(成功)或者D3DERR_INVALIDCALL,如果返回值是D3DERR_INVALIDCALL,就表示可能弄错了其中一个参数。Adapter参数的类型为UINT,其值为要取得信息的适配器的编号。这个编号介于0到适配器数量减1之间。Flags参数的值要么是0,要么是常量D3D_ENUM_NO_WHQL_LEVEL,D3D_ENUM_NO_WHQL_LEVEL的含义稍后会讲到。通常情况下,这个参数的值为0。最后一个参数pIdentifier是一个指向D3DADAPTER_IDENTIFIER8结构体的指针。学习游戏制作,必然少不了有关DirectX的结构体的部分。表1.1列出了D3DADAPTER_IDENTIFIER8的成员以及含义。表1.1D3DADAPTER_IDENTIFIER8的成员成员含义Driver含有驱动程序名的字符串Description含有对适配器描述的字符串DriverVersion驱动程序的版本VendorID用来标示特殊的芯片组DeviceID用来标示特殊的芯片组SubSysID用来标示特殊的芯片组Revision用来标示特殊的芯片组DeviceIdentifier程序和适配器的全局惟一标识符(GUID)WHQLLevel认证日期8Direct3D中的2D编程前两个成员Driver和Description都是人可识别的。举例来说,如果要为系统安放一个带有不同驱动程序的组合框,就会用到这两个成员。剩下的其他几个成员用来标示特殊的芯片组。WHQLLevel成员包含了一个位编码(bit-encoded)日期,一个1或者一个0。WHQL是WindowHardwareQualityLab(Windows硬件质量实验室)的缩写。如果WHQLLevel的值为0,则说明驱动程序/适配器这一对没有通过认证;如果等于1,就表明通过了认证,但是没有可用的日期信息。采用别的方式,使用位0到7表示日,位8到15表示月,位16到31表示年。如果WHQLLevel成员的值指定为D3D_ENUM_NO_WHQL_LEVEL,则不管怎样,WHQLLevel成员的值都会是0。这样就会很方便,因为从显示器驱动程序中获得图1.3范例1.2的stdout.txtWHQLLevel成员的值只需数秒时间。范例1.2(在本书附赠的光盘上(X:\Source\Example1_2))列举了显示适配器,并将显示适配器的Driver和Description成员的信息输出到文件stdout.txt中。到目前为止,所举的例子仍然很初级,顶多就是显示一个黑色的窗口,每次你可能都恨不得立即把它关掉了事。图1.3显示了这个程序在我的电脑上运行所产生的stdout.txt文件的内容。1.4.2设备类型现在可以注意你的系统的显示适配器了(即使只有一个显示适配器),你要做好准备查看不同类型设备的驱动程序性能。针对硬件支持的千差万别,存在3种能够创建的设备类型:第1种设备是硬件抽象层(hardwareabstractionlevel,缩写为HAL)设备。这种设备的优点在于具有硬件加速功能,缺点是必须有适配器(译者注:通常指显卡)的支持,如果适配器不支持某种特性,那么HAL设备就不能模拟出这种特性。第2种设备类型被称为参考光栅化器(referencerasterizer,也称参比设备)。这种类型的设备提供了用软件模拟的大部分Direct3D的功能,他依赖于特殊的CPU指令集,但是和HAL设备相比,这种设备同软件模拟设备一样,在速度方面较慢。第3种设备类型是纯软件模拟设备(puresoftwaredevice)。对于这种设备类型,本章就不进行介绍了,因为要把这种设备类型讲清楚,至少需要整整一本书。在D3DDEVTYPE枚举类型中,这三种类型的设备都有各自的值,表1.2显示了这些值,9第1章初始化Direct3D这些数字代表了对应的设备。表1.2D3DDEVTYPE枚举类型标识符值含义D3DDEVTYPE_HAL1Â使用HAL产生硬件加速D3DDEVTYPE_REF2Â参考光栅化器D3DDEVTYPE_SW3Â软件光栅化(Softwarerasterizer)因为本书没有

编辑推荐

  • 名称/格式
  • 评分
  • 下载次数
  • 资料大小
  • 上传时间

用户评论(1)

0/200
  • likebeta 2012-07-06 02:22:14

    不错,很清晰

上传我的资料

相关资料

资料评价:

/ 219
所需积分:2 立即下载
返回
顶部
举报
资料
关闭

温馨提示

感谢您对爱问共享资料的支持,精彩活动将尽快为您呈现,敬请期待!