




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 . 第13章 DirectX编程入门DirectX是微软公司为编写游戏和其他高性能多媒体应用程序而开发的一组高级的Windows低层API,它包含了对图(图形、视频和三维动画)、声音(声效与音乐)、输入设备和网络游戏等的支持。本章先概述DirectX的基本容,然后介绍DirectX的主要组件Direct3D和DirectSound的基本编程方法,并给出若干具体编程实例。13.1 DirectX概述本节简单介绍DurectX的发展历史、版本和功能的演化、结构和模块划分。DurectX是Windows的一种多媒体API,它在保持设备无关性的同时,可以让应用程序直接控制多媒体设备,从而能充分利用硬
2、件的功能,因此可获得最高的性能。DurectX自从推出以来,就始终处在快速发展的过程之中。它已经经历了多个版本,其模块和功能也一直在不断地增加和完善。DirectX是一种基于COM的系统,主要由硬件抽象层HAL和硬件模拟层HEL所构成。DurectX被分成若干个组件模块,涵盖了多媒体应用的方方面面。而且这些组件的数目、名称和功能,也是随着其版本的演化而有所增减、改变和加强。13.1.1 历史微软公司于1990年5月推出的Windows 3.0大获成功,它是一种与设备无关的具有图形用户界面(GUI)的操作系统。后来又于1992年3月推出Windows 3.1,提供了对多媒体的支持。不过Windo
3、ws的与设备无关的设计思想,虽然使得Windows向程序员提供了一个独立于硬件的软件开发优秀平台,但它不让应用程序直接操作显卡和声卡等多媒体硬件,这样就降低了多媒体应用程序(特别是计算机游戏)的运行效率,例如限制了动画的帧率、不提供混音功能等。所以当时的Windows并不是一个可以开发和运行高效多媒体程序(如3D游戏)的理想环境,逼迫PC游戏开发商只好绕开Windows而仍旧开发DOS下的游戏。为了改变这种难堪的局面,促使游戏界放弃DOS而使用Windows,微软需要在设备无关性与高性能之间取得某种平衡,决定为Windows添加一种高性能的动画机制(以与后来的输入与音响等),因此于1995年推
4、出了Game SDK,后来改名为DirectX。其中的Direct指可以直接访问多媒体硬件;X指它的不同组成部分,如Direct3D、DirectSound、DirectInput和DirectPlay等。13.1.2版本与功能因为DirectX必须支持多媒体设备的最新技术和功能,而多媒体硬件(尤其是显卡的3D性能)和技术始终处在高速发展过程中,所以DirectX的技术和版本也同样在不断地发展和演变,其中发展最快的是3D接口部分。下面列出DirectX的主要版本的发布时间、引入的新模块和特性:n 1.01995年9月30日:DirectDraw、DirectSound、DirectInput、
5、DirectPlay、DirectSetup;n 2.01996年6月5日:引入Direct3D(次版本有2.0a);n 3.01996年9月15日:支持MMX、为DirectSound 补充DirectSound3D API(次版本有3.0a);n 4.0无此版本号;n 5.01997年7月16日:有许多改进,如受力反馈控制器、多显示器支持、新的游戏控制面板、用户界面的全面改进等(次版本有5.1和5.2);n 6.01998年8月7日:添加新的3D特性(如添加DXUT框架)、支持AMD公司的3DNow!技术、性能较5.0有提高。在1999年2月3日推出的6.1版中,添加了DirectMusi
6、c模块;n 7.01999年9月22日:改进3D图形和声音、性能更快,为Direct3D API引入硬件传送、光照和纹理压缩、以与硬件加速,引入D3DX工具库。使用Creative公司的EAX技术改进3D声音的算法(次版本有7.0a和7.1);n 8.02000年9月30日:将DirectDraw与Direct3D完全集成在一起、其中Direct3D的性能有了本质上的飞跃(引入顶点/像素shader着色引擎/光照模型、支持硬件点精灵和三维体纹理),将DirectMusic与 DirectSound更紧密地集成在一起构成DirectX Audio,更新了DirectInput与DirectPla
7、y,添加了DirectShow、抛弃了其余的DirectX Media模块。2001年11月11日推出的8.1版,被集成在Windows XP中销售,该版本添加了从DirectShow分离出的DMO(DirectX Media Objects媒体对象)组件模块。它还支持许多新的图形特性,如像素着色引擎的1.21.4版、动态/高分辨率纹理、新3D扩展方法等(次版本有8.0a、8.1、8.1a和8.1b);n 9.02002年12月24日:添加许多新特性到DirectX Graphics和DirectShow中,例如将DirectDraw的功能并入到Direct3D之中,支持顶点和像素着色引擎的新
8、版本2.0和3.0,引入裁剪测试、位移贴图和多元纹理,支持128位浮点着色精度和根据显示器自动调整值等。也添加若干新特性到DirectInput、DirectPlay、DirectSound和DirectMusic中。(次版本有9.0a、9.0b和9.0c)。DirectX的最后一个以数字和字母命名的版本是2004年8月9日推出的9.0c,后来又于2004年10月、2005年的2/4/6/8/10月分别推出了它的多个升级版。从2005年12月推出的DirectX开始,其版本的命名发生了变化:主版本号改为DX,次版本改为发布的年月。一般是每两个月推出一个新版本,因此也叫做DirectX 9.0c
9、的双月更新(bimonthly updates)。当前最新版本为2006年10月11日推出的DX October 2006。它们都包含了(于2002年推出的专为.NET框架设计的)托管(Managed)DirectX,将原来DirectX多个分离的COM模块集成到了一个容易使用的单一CLR文件之中。n 10?:DirectX不会有第10版了,因为微软公司已将DirectX的功能集成进其新一代操作系统Windows Vista中,而不再将其作为一个额外的模块了。但是会有Direct3D 10,已于2006年12月13日随Direct3D SDK的December 2006版一起发布,并被嵌入到W
10、indows Vista中。另外,作为学生和业余爱好者的DirectX替代产品,微软公司于2004年3月24日宣布了用于托管运行环境下计算机游戏的设计、开发和管理的框架和工具集XNA,并于2006年12月11日推出了XNA Framework Redistributable 和XNA Game Studio Express的1.0版,可用于Windows和Xbox 360游戏的开发。Windows API应用程序Windows API子系统(GDI、MMAPI、MCI、.)Windows驱动程序接口DirectXHELHALPC硬件子系统DirectX13.1.3结构图13-1 DirectX
11、子系统DirectX是一种基于COM(Component Object Model,组件对象模型)的系统,它既不属于驱动程序层,也不属于应用层。DirectX的主要设计目标是在提供某种设备独立性的同时获取高速度,为此微软公司为DirectX设计了如图13-1所示的体系结构。其中:n HAL = Hardware Abstract Layer(硬件抽象层)负责检测本机的硬件功能,并以一种独立于设备的方式提供这些功能;n HEL = Hardware Emulation Layer(硬件模拟层)负责提供DirectX功能中本机硬件不支持部分的模拟实现。但是从8.0版起,DirectX就不再提供硬件
12、模拟层HEL了,需要开发商、第三方或自己来编写一个PSD(Pluggable Software Device可插式软件设备)连到DirectX提供的HEL接口上,称之为参考设备。但是现在很少有这样的PSD可用,因此新版本的DirectX是严重依赖于硬件的。13.1.4组成DirectX由多个(COM组件)模块组成,而且随着版本的演化,这些模块也在不断地增减、合并和改变。最新的DirectX组件的模块构成如图13-2所示,括号中的数字为该模块被首次引进(或移出)的版本号。下面是DirectX的主要组成模块的简单介绍:n DirectX Graphics(图形) 包括DirectDraw和Dire
13、ct3D:u DirectDraw(绘制) 二维图形绘制(高速位图传送/视频与2D动画)。从9.0版起,DirectDraw已被集成到了Direct3D之中。u Direct3D(三维) 三维图形绘制。分成保留(retained)和立即(immediate)两种模式(mode):保留模式是一种高层API,建立在立即模式之上,使用起来方便容易,但是效率不高,适合于初学者;立即模式则是一种底层API,使用复杂,但是其效率比保留模式高得多。大多数DirectX应用程序,特别是计算机游戏,都是采用立即模式进行开发。自从6.0版以来,保留模式API的发展停滞不前,而立即模式API的发展却日新月异。不论是
14、保留模式还是立即模式,Direct3D都是建立在DirectDraw之上的。从9.0版起,Direct3D包含了DirectDraw,它像OpenGL一样也具有二维图形绘制的功能。Direct3D的下一个版本为Durect3D 10,为Windows Vista的一个有机组成部分。l D3DX(Direct3D扩展) 为Direct3D服务的实用工具库,执行公共的数学计算和一些复杂的任务,包含若干简化3D模型使用的类,如粒子系统(particle system)。D3DX由动态库(DLL)提供。l DXUT(编程框架) 建立在Direct3D API之上的样例框架,也叫通用文件框架,可以帮助程
15、序员减少在繁琐的平凡工作(如创建窗口、创建设备、处理Windows消息和设备事件等)上所花的时间。DirectXDirectX Graphics (8.0)DirectDraw (1.0)Direct3D (2.0)DirectX Audio (8.0)DirectSound (1.0)DirectMusic (6.1)DirectSound 3D (3.0)DirectInput (1.0)DirectPlay (1.0)DirectSetup (1.0)DirectX Media (5.0)DirectShow (5.0)DirectAnimation (5.0)DirectX视频加速 (
16、5.0)Direct3D保留模式 (5.0)DirectX Transform (5.0)并入(9.0)移入平台SDK (9.0c 2005.4)建议用WinSocket和WinFirewall API代替 (9.0c)并入(8.0)移入Windows Media SDK (8.0)XInput (9.0c 2005.10)Xbox Live (Vista)Media Foundation (Vista)XACT (9.0c 2006.2)XNA (Xbox/Vista)DirectX Media Objects (8.1)分出(8.1)并入(6.0)Direct3D立即模式 (2.0)D3D
17、X (7.0) / DXUT(6.0)图13-2 DirectX的组成模块n DirectX Audio(音频)包括DirectSound和DirectMusic:u DirectSound(声音) 主要针对波形音频,底层接口。可用于开发播放和捕捉波形音频的高性能立体与三维(DirectSound 3D)音频应用程序。在下一代DirectX中,DirectSound的功能将由XACT(Microsoft Cross-Platform Audio Creation Tool微软跨平台音频生成工具)来代替。u DirectMusic(音乐) 主要针对MIDI音乐,高层接口。为基于波形、MIDI声音
18、或DirectMusic生成器所创造的动态容之音乐和非音乐声道提供一个完整的解决方案。u XACT(游戏音频) XACT(Microsoft Cross-Platform Audio Creation Tool,微软跨平台音频生成工具),是一种多人合作的音频设计工具和相关API,用于游戏的动态音频开发。n DirectInput(输入) 提供对各种输入设备的支持,包括对受力反馈(force-feedback)技术的全面支持。在下一代DirectX中,DirectInput将被XInput代替。n DirectPlay(游戏) 提供对多人网络游戏的支持。在最新的DirectX版本中,微软公司反对
19、(deprecate)使用DirectPlay,而建议改用Windows Sockets和Windows Firewall API来代替。在下一代DirectX中,DirectPlay可能会被Xbox Live代替。n DirectSetup(安装) 提供DirectX组件的一次性调用安装的一个简单API(自动安装DirectX驱动程序)。n DirectShow(展示) 提供多媒体(音视频)流的高质量捕捉和重放。在8.0版之前,DirectShow是DirectX Media的一个组成模块。到8.0版时,因为DirectX SDK抛弃了DirectX Media,所以才将DirectShow
20、集成到了DirectX之中。在DirectX 9.0c的2005年4月升级版中,DirectShow又被移出DirectX,放入微软公司的平台SDK之中。n DirectX Media Objects(媒体对象DMO) 基于COM的多媒体和数据流组件,支持音视频的编解码器和特效。是在DirectX的8.1版时,从DirectShow分出的,其功能类似于DirectShow的过滤器。n DirectX Media(媒体) 是一个用于流媒体应用的外部API集合。在DirectX 6.0之前,DirectX Media SDK和DirectX SDK是两个分离的SDK。在6.0版时DirectX M
21、edia SDK被集成到DirectX SDK之中。DirectX Media的运行模块,被集成到Windows和IE之中。到了8.0版时,DirectX Media又被DirectX SDK抛弃(其核心模块DirectShow被集成到了DirectX之中),其功能被随Windows 2000 Server推出的Windows Media SDK所代替。u DirectX Transform(变换) 用于产生二、三维图形的各种效果,如混色和表面弯曲等。u DirectAnimation(动画) 集成多种媒体类型来创建复杂动画,并可用作网页容。u DirectX Video Accelerati
22、on(视频加速DXVA) 利用硬件加速二维视频的解码操作。u Direct3D Retained Mode(保留模式) Direct3D的保留模式是一种高层API,建立在Direct3D立即模式之上,使用起来方便容易,但是效率不高,适合于初学者。u DirectShow(展示) 支持音视频流的高质量采集和重放。13.1.5编程准备为了用VC编写DirectX应用程序,必须先下载并安装DirectX SDK,并进行必要的头/库文件路径和库的设置。下面以Windows XP中文版环境下的Visual C+ 2005中文版和DirectX 9.0cAugust 2006 SDK为例,介绍进行具体的D
23、irectX编程之前,所需做的必要准备工作。l 下载并安装DirectX SDK可以从微软公司的官方()下载最新的DirectX SDK,如dxsdk_dec2006.exe(448MB)。安装完成后,会在安装目录(缺省为“C:Program FilesMicrosoft DirectX SDK (December 2006)”)中生成Developer Runtime、Documentation、Include、Lib、Redist、Samples和Utilities等多个子目录。安装时还会为Windows操作系统生成名为“Microsoft DirectX SDK (December 20
24、06)”的程序组,包含多个子程序组和程序。安装程序会将DirectX SDK的帮助文档,也安装到Visual Studio 2005的帮助系统,位于其“目录/DirectX SDK (December 2006)”目录之中,包含“DirectX SDK (December 2006) C+”和“DirectX SDK (December 2006) Managed”两个帮助子目录。l 设置包含和库路径在Visual Studio 2005中文版的IDE中,选“工具/选项”菜单项,打开“选项”对话框(参见图13-5)。图13-5 Visual Studio 2005的“选项”对话框再选该对话框左
25、边的“项目和解决方案/VC+目录”路径,在右边的“显示以下容的目录”栏的下拉式列表框中,选“包含文件”项。按该栏下面的“新行”钮,则在其下方的显示栏中会出现新行,再按新行右端的带省略号的浏览钮,在弹出的“选择目录”对话框中,选择DirectX SDK的Include目录所在的路径“C:Program FilesMicrosoft DirectX SDK (August 2006)Include”,然后按“打开”关闭“选择目录”对话框。结果参见图13-6。图13-6 设置DirectX的“包含文件”的路径可类似选择“库文件”项,添加库文件路径“C:Program FilesMicrosoft D
26、irectX SDK (August 2006)Libx86”,结果参见图13-7。最后,按“确定”钮,关闭“选项”对话框。图13-7 设置DirectX的“库文件”的路径注意,对DirectX的包含路径和库路径的设置,对所有项目都有效。l 设置库先创建一个DirectX应用程序的MFC单文档项目(如DxTest),再在VS05的IDE中,选“项目/属性”,打开“DxTest属性页”对话框。在左上角的“配置”栏中,选中“所有配置”项;再选左边的路径“配置属性/器/输入”,在右边的“附加依赖项”栏中,添加d3d9.lib d3dx9.lib d3dxof.lib dsound.lib dxgui
27、d.lib winmm.lib等库(在多个库文件之间,用空格分隔)。具体添加哪些DirectX库,与具体应用程序所使用的DirectX模块有关,你也可以查看DirectX的库目录。最后,按“应用”钮和“确定”钮,关闭属性页对话框。参见图13-8。图13-8 设置DirectX的库注意,对DirectX库的设置,只对VC05中当前打开的单个项目有效。在安装了DirectX SDK,并设置好文件路径和库后,就可以开始编写具体的DirectX应用程序了。DirectX的组件众多、功能强大、编程复杂,完整的介绍需要几本大部头的专著才行,本书只准备简单介绍DirectX的最主要模块Direct3D和Di
28、rectSound编程的最基本容。13.2 Direct3D编程简介Direct3D(直接三维)是DirectX的核心模块,新版本的Direct3D中还包含原来DirectDraw模块的2D功能。因此,现在的Direct3D是DirectX Graphics的唯一模块,具有DirectX(二、三维)图形的全部功能。13.2.1 流水线与设备Direct3D用图形流水线(graphics pipeline)来处理和渲染场景(render scene),而Direct3D设备(device)是执行变换(transformation)和光照(lighting)等操作的渲染部件。l Direct3D图
29、形流水线可通过Direct3D图形流水线来充分利用硬件性能,以提供高效处理和绘制Direct3D场景到显示器的能力。图13-9为流水线(pipeline,管线/管道/流程)的组成模块框图。顶点数据图元数据镶嵌顶点处理几何处理像素处理像素绘制纹理采样器纹理表面图13-9 Direct3D图形流水线l Direct3D设备图13-10 Direct3D设备架构变换模块光照模块光栅化器Direct3D设备架构Direct3D设备(device)是Direct3D的渲染部件,它封装和存储渲染状态。另外,它还执行变换和光照等操作,并且光栅化图像到表面(如屏幕)。在结构上,Direct3D设备包含变换模块
30、(transformation module)、光照模块(lighting module)和光栅化器(rasterizer)。图13-10为Direct3D的设备架构(architecture)。当前,Direct3D有两种主要的设备类型:n HAL设备(hal device) 具有硬件加速的光栅化(rasterization),可同时使用硬件和软件的顶点处理进行着色(shading)。n 参考设备(reference device) 由软件驱动程序提供,现在主要用于性能测试。创建Direct3D对象创建Direct3D设备对象设置渲染状态定义顶点格式创建顶点缓冲区锁定顶点缓冲区解锁顶点缓冲区
31、开始场景结束场景构造几何对象设置材质和光照或纹理设置设备的流源和顶点格式绘制图元展现场景进行世界、观察和投影矩阵变换清除对象清除显示表面具有软件特性的参考设备不一定能提供与硬件等同的性能,因此应用程序必须总是查询设备的能力以确定其支持哪些特性。13.2.2 基本编程过程Direct3D的基本编程过程如图13-11所示。下面各小节依次介绍Direct3D编程的基本步骤和方法。13.2.3 创建和初始化对象为了使用Direct3D,你必须首先创建一个应用窗口,然后再创建和初始化Direct3D对象。利用这些对象所实现的COM接口来操作它们,以创建绘制场景所需的其它对象。如果进行MFC编程,则可以省
32、略创建窗口这一步,而直接使用视图类所代表的客户区窗口。图13-11 Direct3D编程的基本过程下面介绍的是初始化Direct3D的容,包括创建Direct3D对象、创建Direct3D设备和设置Direct3D设备的渲染(render着色)状态等。l 创建Direct3D对象可使用全局函数Direct3DCreate9来创建Direct3D接口对象:IDirect3D9 * Direct3DCreate9( / 成功返回指向IDirect3D9接口的指针,失败返回NULL UINT SDKVersion / 必须为D3D_SDK_VERSION);例如:IDirect3D9 * g_pD3
33、D = Direct3DCreate9( D3D_SDK_VERSION );l 创建Direct3D设备可使用IDirect3D9接口的CreateDevice方法来创建设备(尾参数的返回值):HRESULT CreateDevice( / 成功返回D3D_OK(= 0) UINT Adapter, / 显卡(display adapter)序号,D3DADAPTER_DEFAULT为主显卡 D3DDEVTYPE DeviceType, / 设备的枚举类型,一般取为D3DDEVTYPE_HAL HWND hFocusWindow, / 焦点窗口句柄,可取为this-m_hWnd DWORD
34、BehaviorFlags, / 控制设备的创建行为之选项组合,可以采用硬件或软件/ 的顶点处理,如D3DCREATE_SOFTWARE_VERTEXPROCESSING D3DPRESENT_PARAMETERS * pPresentationParameters, / 指向展现参数结构/ D3DPRESENT_PARAMETERS的指针 IDirect3DDevice9 * ppReturnedDeviceInterface / 代表被创建设备的/ IDirect3DDevice9返回接口的指针地址);其中,展现参数结构D3DPRESENT_PARAMETERS的定义为:typedef s
35、truct D3DPRESENT_PARAMETERS / 展现参数结构UINT BackBufferWidth, BackBufferHeight; / 后台缓冲区的宽高(以像素为单位),/ 对窗口模式可取为0,对全屏模式则必须与当前显卡枚举模式的一致D3DFORMAT BackBufferFormat; / 后台缓冲区的格式,可取为/ D3DFMT_UNKNOWN(= 0) UINT BackBufferCount; / 后台缓冲区计数,可取为03,取0时等价于1D3DMULTISAMPLE_TYPE MultiSampleType; / 多样本类型,一般取为/ D3DMULTISAMPL
36、E_NONE(= 0) DWORD MultiSampleQuality; / 多样本质量水平,一般取0D3DSWAPEFFECT SwapEffect; / 交换效果,可取为/ D3DSWAPEFFECT_DISCARD(= 1)、D3DSWAPEFFECT_FLIP(= 2)/ 和D3DSWAPEFFECT_COPY(= 3)等枚举值 HWND hDeviceWindow; / 设备窗口的句柄,对窗口模式可取为NULL(= 0) BOOL Windowed; / 应用程序在窗口/全屏中运行时取TRUE/FALSEBOOL EnableAutoDepthStencil; / 允许自动深度模板
37、,为TRUE则由Direct3D/ 来管理应用程序的深度缓冲区D3DFORMAT AutoDepthStencilFormat; / 自动深度模板格式,可取/ D3DFMT_D16、D3DFMT_D24S8和D3DFMT_D32等枚举值 DWORD Flags; / 表现标志D3DPRESENTFLAG常数之一,可取为0 UINT FullScreen_RefreshRateInHz; / 全屏时的屏幕刷新率,对窗口模式必须为0UINT PresentationInterval; / 前后台缓冲区交换的最大速率,可取为/ D3DPRESENT_INTERVAL_DEFAULT(= 0) D3D
38、PRESENT_PARAMETERS;例如: / 设置创建D3D设备用的表现结构 D3DPRESENT_PARAMETERS d3dpp; / 定义表现结构变量 ZeroMemory( &d3dpp, sizeof(d3dpp) ); / 存清零 d3dpp.Windowed = TRUE; / 窗口模式 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; / 放弃交换效果 d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; / 未知格式 d3dpp.EnableAutoDepthStencil = TRUE; / 允许自动深度模板
39、 d3dpp.AutoDepthStencilFormat = D3DFMT_D16; / 16位深度缓冲 LPDIRECT3DDEVICE9 g_pd3dDevice; / 定义D3D设备接口的指针/ 创建D3D设备对象(获取D3D设备接口的指针) g_pD3D-CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, this-m_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp, &g_pd3dDevice );l 设置设备的渲染状态利用IDirect3D9接口的CreateDevice方法所返回的
40、设备接口IDirect3DDevice9的指针,可以调用该接口的设置渲染(render着色)状态方法SetRenderState,来初始化设备:HRESULT SetRenderState( / 成功返回D3D_OK(= 0) D3DRENDERSTATETYPE State, / 设备状态 DWORD Value / 设置值);其中,设备状态State,可取D3DRENDERSTATETYPE枚举的任意值,如D3DRS_ZENABLE(允许Z缓冲)、D3DRS_FILLMODE(填充模式)、D3DRS_SHADEMODE(阴影模式)、 D3DRS_ALPHATESTENABLE(允许测试)、
41、D3DRS_CULLMODE(剔除模式)、D3DRS_FOGENABLE(允许雾化)、D3DRS_LIGHTING(光照)、D3DRS_DITHERENABLE(允许抖动)、。例如:g_pd3dDevice-SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );/ 关闭背面剔除g_pd3dDevice-SetRenderState( D3DRS_ZENABLE, TRUE ); / 允许Z缓冲g_pd3dDevice-SetRenderState( D3DRS_LIGHTING, FALSE ); / 关闭光照13.2.4 创建场景三维场景是由若干物体(
42、几何对象)构成的,复杂的几何对象由多个简单的图元(点、线、三角形和多边形等)所组成,而图元(primitive)又是顶点(vertex)的集合。图13-12 3D图元表面的三角网格3D图元一般是一个多面体,通常用其表面的三角网格来表示,参见图13-12。所以最基本的图元是三角形和顶点。创建场景中的几何对象,等价于建立表示该几何体的顶点集合。因此,必须先定义自己的顶点结构并创建顶点缓冲区,然后在锁定顶点缓冲区后,再通过给顶点缓冲区中的各顶点结构赋值来构造几何对象,最后解锁顶点缓冲区。l 定义顶点结构Direct3D使用一种FVF(Flexible Vertex Format可变顶点格式)结构来定
43、义顶点,以满足用户的不同需要。在FVF结构CUSTOMVERTEX中,可以包含描述顶点的位置、RHW(reciprocal homogeneous w倒数齐次w,表示已变换顶点位置的齐次坐标w分量)、法向、大小和(漫射、镜面反射)颜色等字段,具体容由用户根据需要自己来确定,但是各字段之间的相对顺序不能改变。其中,顶点的位置和法向等字段,一般为三维点向量,可以用Direct3D的扩展三维向量结构D3DXVECTOR3来表示:typedef struct D3DXVECTOR3 FLOAT x;FLOAT y; FLOAT z; D3DXVECTOR3;其中的FLOAT为float的typedef
44、类型,定义在windef.h头文件中。而颜色一般采用DWORD的typedef定义类型D3DCOLOR。例如:struct CUSTOMVERTEX / 含位置、法向量和颜色的自定义顶点结构D3DXVECTOR3 position; / 未变换顶点的3D位置D3DXVECTOR3 normal; / 顶点的表面法向量D3DCOLOR color; / 颜色; 或:struct CUSTOMVERTEX / 含位置、颜色和纹理坐标的自定义顶点结构 D3DXVECTOR3 position; / 未变换顶点的3D位置 D3DCOLOR color; / 颜色 FLOAT tu, tv; / 纹理坐
45、标; 或:struct CUSTOMVERTEX / 含位置齐次坐标和颜色的自定义顶点结构FLOAT x, y, z, rhw; / 已变换顶点的3D位置DWORDcolor; / 颜色;用户在定义了自己的顶点结构类型后,还需要定义一个对应的(宏)常量,来描述该结构的字段容。该(宏)常量由若干表示顶点格式的标志位符号常量(参见表13-1)的位或组合而成。表13-1 顶点数据格式标志符号常量值数据类型描述D3DFVF_XYZ0x002float, float, float未转换的顶点坐标D3DFVF_XYZRHW0x004float, float, float, float已转换的顶点坐标D3D
46、FVF_XYZB150x006/8/a/c/e1- 3个float含权重i的顶点坐标D3DFVF_XYZW0x4002float, float, float, float已转换和裁剪的顶点坐标D3DFVF_NORMAL0x010float, float, float顶点的法线D3DFVF_PSIZE0x020float点大小D3DFVF_DIFFUSE0x040DWORD(ARGB)漫射颜色D3DFVF_SPECULAR0x080DWORD(ARGB)镜面反射颜色D3DFVF_TEX080x08001- 4个floati重纹理映射例如:#define D3DFVF_CUSTOMVERTEX (
47、D3DFVF_XYZ|D3DFVF_NORMAL | D3DFVF_DIFFUSE)或:#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)或:const DWORD FVF = (D3DFVF_XYZRHW | D3DFVF_DIFFUSE);l 创建顶点缓冲区在定义了顶点结构后,就可以创建顶点缓冲区了,这可以由IDirect3DDevice9接口的CreateVertexBuffer方法来完成:HRESULT CreateVertexBuffer( / 成功返回D3D_OK(= 0) UINT Length,
48、 / 缓冲区的字节大小,一般为 n*sizeof (CUSTOMVERTEX) DWORD Usage, / 缓冲区用法的附加属性标志,一般为0 DWORD FVF, / 顶点结构格式常量 D3DPOOL Pool, / 缓冲区所在的存池类型(D3DPOOL枚举值) IDirect3DVertexBuffer9* ppVertexBuffer, / 返回被创建的顶点缓冲区指针 HANDLE* pSharedHandle / 保留,设为NULL);其中,存池类型D3DPOOL枚举的定义为:typedef enum D3DPOOL / 存池类型枚举 D3DPOOL_DEFAULT = 0, / A
49、GP存储器或显存 D3DPOOL_MANAGED = 1, / AGP存储器或显存,且在系统存中还有一份拷贝 D3DPOOL_SYSTEMMEM = 2, / 系统存 D3DPOOL_SCRATCH = 3, / 系统存中的临时池 D3DPOOL_FORCE_DWORD = 0x7fffffff / 未使用(强制该枚举被编译成32位) D3DPOOL;例如:g_pd3dDevice-CreateVertexBuffer( 100 *sizeof(CUSTOMVERTEX),0, D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT, &g_pVB, NULL );或:g_pd
50、3dDevice-CreateVertexBuffer( 3 *sizeof(CUSTOMVERTEX),0, FVF,D3DPOOL_MANAGED, &g_pVB, NULL );l 构造点集创建三维场景中的几何对象,需要计算和构造描述该几何对象的点集。具体做法是:先定义一个顶点指针(用于操作顶点数组);再调用Lock方法来获取顶点缓冲区的首地址(赋值给顶点指针),并锁定该区域仅供当前操作使用;然后利用该顶点指针,将计算的顶点结构值填入顶点缓冲区,从而构造出几何对象;最后调用Unlock方法解锁顶点缓冲区。IDirect3DVertexBuffer9接口的Lock和Unlock方法的定义为
51、:HRESULT Lock( / 成功返回D3D_OK(= 0) UINT OffsetToLock, / 锁定的偏移地址 UINT SizeToLock, / 锁定的字节数 VOID * ppbData, / 返回被锁定的缓冲区头的指针 DWORD Flags / 锁定方式标志,可为0或下列符号常量的组合:/ D3DLOCK_DISCARD、D3DLOCK_NO_DIRTY_UPDATE、/ D3DLOCK_NOSYSLOCK、D3DLOCK_READONLY、/ D3DLOCK_NOOVERWRITE);HRESULT Unlock(); / 成功返回D3D_OK(= 0)例如:CUSTO
52、MVERTEX* pVertices;g_pVB-Lock( 0, 0, (void*)&pVertices, 0 ); / 给顶点缓冲区中的各顶点结构赋值(构造几何对象的点集)g_pVB-Unlock();13.2.5 矩阵变换描述单个物体(3D几何对象)一般采用的是本地相对坐标。因此,在渲染之前,需要将它们都转换为描述场景的统一世界空间(world space)坐标,这对应于世界矩阵变换。为了将三维场景显示在二维屏幕上,还需要选择一个观察点(眼睛/摄像机)和观察角度(方向/坐标)(对应于观察坐标矩阵变换),并将3D场景投影到一个2D平面(屏幕)上(对应于投影矩阵变换),还要将超出屏幕的部分
53、去掉(裁剪),也可以将场景投射到屏幕的某个矩形区域中(视口缩放)。参见图13-13。世界变换观察变换投影变换裁剪与视口缩放顶点光栅器变换引擎图13-13 Direct3D的变换引擎下面依次对这些变换加以介绍,这需要首先介绍Direct3D中的矩阵定义和变换方法。l 矩阵与变换在Direct3D中,定义了矩阵(matrix)结构D3DXMATRIX :typedef struct D3DXMATRIX / 矩阵结构 struct / 注意,C/C+的变量名可以下划线开头(但不能以数字开头) FLOAT _11;FLOAT _12;FLOAT _13;FLOAT _14; FLOAT _21;FL
54、OAT _22;FLOAT _23;FLOAT _24; FLOAT _31;FLOAT _32;FLOAT _33;FLOAT _34; FLOAT _41;FLOAT _42;FLOAT _43;FLOAT _44; ; D3DXMATRIX;对应于4*4的浮点矩阵:在Direct3D中,还定义了一个对Intel P4 CPU运算进行了优化的16字节对齐的矩阵结构(从D3DXMATRIX派生的C+结构对象):typedef struct _D3DXMATRIXA16 : public D3DXMATRIX / 16字节对齐矩阵结构 _D3DXMATRIXA16(); _D3DXMATRIX
55、A16( CONST FLOAT * f); _D3DXMATRIXA16( CONST D3DMATRIX& m); _D3DXMATRIXA16( FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14, FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24, FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34, FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44 ); void* operator new(size_t s); void* operator new(size_t s); void operator delete(void* p); void operator delete(void* p); struct _D3DXMATRIXA16& operator=(CONST D3DXMATRIX& rhs); _D3DXMATRIXA16;typedef D
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新疆客运资格证实操试题
- 2025年创新创业管理专业研究生入学考试试题及答案
- 未来的生活想象想象并描写细节类作文(6篇)
- 小品(卖药之八仙过海)剧本
- 某超市讲解服务制度
- 2025年柔性制造单元(FMC)项目提案报告
- 运动场馆设计与运营合作协议
- 2025年压缩天然气项目申请报告
- 2025年电梯司机(中级)电梯设备维护保养与故障排除测评试题
- 2025年物流师(初级)职业技能鉴定试卷物流企业人力资源战略规划
- 1-会计信息系统(闭卷)国开机考答案
- 酒店用火用电安全管理制度
- 模具机加工管理制度
- 中医养生保健与康复护理
- 区畜牧局十五五总结及十五五规划
- 2025年普通高等学校招生全国统一考试(全国I卷英语)及答案
- 银行支行安全防范教育培训制度
- 艾梅乙考试试题及答案
- T/CECS 10363-2024薄壁不锈钢管件用法兰及法兰接头
- DB31/T 1096-2018医院日间手术管理规范
- 2025年MySQL数据库编程试题及答案
评论
0/150
提交评论