多媒体技术13DirectX编程入门.docx

上传人:牧羊曲112 文档编号:2019126 上传时间:2022-12-31 格式:DOCX 页数:59 大小:1,022.64KB
返回 下载 相关 举报
多媒体技术13DirectX编程入门.docx_第1页
第1页 / 共59页
多媒体技术13DirectX编程入门.docx_第2页
第2页 / 共59页
多媒体技术13DirectX编程入门.docx_第3页
第3页 / 共59页
多媒体技术13DirectX编程入门.docx_第4页
第4页 / 共59页
多媒体技术13DirectX编程入门.docx_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《多媒体技术13DirectX编程入门.docx》由会员分享,可在线阅读,更多相关《多媒体技术13DirectX编程入门.docx(59页珍藏版)》请在三一办公上搜索。

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,提供了对多媒体的支持。不过Windows

3、的与设备无关的设计思想,虽然使得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、D

5、irectPlay、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版中,添加了DirectMusic

6、模块;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与DirectPlay

7、,添加了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版一起发布,并被嵌入到Wi

10、ndows 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和Dir

13、ect3D: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)

17、D3DX (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音乐,高层接口。为基于波形、MID

18、I声音或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,所以才将Direct

20、Show集成到了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版时Direc

21、tX Media 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 Accel

22、eration(视频加速DXVA) 利用硬件加速二维视频的解码操作。u Direct3D Retained Mode(保留模式) Direct3D的保留模式是一种高层API,建立在Direct3D立即模式之上,使用起来方便容易,但是效率不高,适合于初学者。u DirectShow(展示) 支持音视频流的高质量采集和重放。13.1.5 编程准备为了用VC编写DirectX应用程序,必须先下载并安装DirectX SDK,并进行必要的头/库文件路径和链接库的设置。下面以Windows XP中文版环境下的Visual C+ 2005中文版和DirectX 9.0c August 2006 SDK为例

23、,介绍进行具体的DirectX编程之前,所需做的必要准备工作。l 下载并安装DirectX SDK可以从微软公司的官方网站( 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 2006

24、)”的程序组,包含多个子程序组和程序。安装程序会将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 d

27、xguid.lib winmm.lib等链接库(在多个库文件之间,用空格分隔)。具体添加哪些DirectX库,与具体应用程序所使用的DirectX模块有关,你也可以查看DirectX的库目录。最后,按“应用”钮和“确定”钮,关闭属性页对话框。参见图13-8。图13-8 设置DirectX的链接库注意,对DirectX链接库的设置,只对VC05中当前打开的单个项目有效。在安装了DirectX SDK,并设置好文件路径和链接库后,就可以开始编写具体的DirectX应用程序了。DirectX的组件众多、功能强大、编程复杂,完整的介绍需要几本大部头的专著才行,本书只准备简单介绍DirectX的最主要模

28、块Direct3D和DirectSound编程的最基本内容。13.2 Direct3D编程简介Direct3D(直接三维)是DirectX的核心模块,新版本的Direct3D中还包含原来DirectDraw模块的2D功能。因此,现在的Direct3D是DirectX Graphics的唯一模块,具有DirectX(二、三维)图形的全部功能。13.2.1 流水线与设备Direct3D用图形流水线(graphics pipeline)来处理和渲染场景(render scene),而Direct3D设备(device)是执行变换(transformation)和光照(lighting)等操作的渲染部

29、件。l Direct3D图形流水线可通过Direct3D图形流水线来充分利用硬件性能,以提供高效处理和绘制Direct3D场景到显示器的能力。图13-9为流水线(pipeline,管线/管道/流程)的组成模块框图。顶点数据图元数据镶嵌顶点处理几何处理像素处理像素绘制纹理采样器纹理表面图13-9 Direct3D图形流水线l Direct3D设备图13-10 Direct3D设备架构变换模块光照模块光栅化器Direct3D设备架构Direct3D设备(device)是Direct3D的渲染部件,它封装和存储渲染状态。另外,它还执行变换和光照等操作,并且光栅化图像到表面(如屏幕)。在结构上,Dir

30、ect3D设备包含变换模块(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接口来操作它们,以创建绘制场景所需的其它对象。如

32、果进行MFC编程,则可以省略创建窗口这一步,而直接使用视图类所代表的客户区窗口。图13-11 Direct3D编程的基本过程下面介绍的是初始化Direct3D的内容,包括创建Direct3D对象、创建Direct3D设备和设置Direct3D设备的渲染(render着色)状态等。l 创建Direct3D对象可使用全局函数Direct3DCreate9来创建Direct3D接口对象:IDirect3D9 * Direct3DCreate9( / 成功返回指向IDirect3D9接口的指针,失败返回NULL UINT SDKVersion / 必须为D3D_SDK_VERSION);例如:IDir

33、ect3D9 * g_pD3D = 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

34、-m_hWnd DWORD BehaviorFlags, / 控制设备的创建行为之选项组合,可以采用硬件或软件/ 的顶点处理,如D3DCREATE_SOFTWARE_VERTEXPROCESSING D3DPRESENT_PARAMETERS * pPresentationParameters, / 指向展现参数结构/ D3DPRESENT_PARAMETERS的指针 IDirect3DDevice9 * ppReturnedDeviceInterface / 代表被创建设备的/ IDirect3DDevice9返回接口的指针地址);其中,展现参数结构D3DPRESENT_PARAMETERS

35、的定义为:typedef struct D3DPRESENT_PARAMETERS / 展现参数结构UINT BackBufferWidth, BackBufferHeight; / 后台缓冲区的宽高(以像素为单位),/ 对窗口模式可取为0,对全屏模式则必须与当前显卡枚举模式的一致D3DFORMAT BackBufferFormat; / 后台缓冲区的格式,可取为/ D3DFMT_UNKNOWN(= 0) UINT BackBufferCount; / 后台缓冲区计数,可取为03,取0时等价于1D3DMULTISAMPLE_TYPE MultiSampleType; / 多样本类型,一般取为/

36、 D3DMULTISAMPLE_NONE(= 0) DWORD MultiSampleQuality; / 多样本质量水平,一般取0D3DSWAPEFFECT SwapEffect; / 交换效果,可取为/ D3DSWAPEFFECT_DISCARD(= 1)、D3DSWAPEFFECT_FLIP(= 2)/ 和D3DSWAPEFFECT_COPY(= 3)等枚举值 HWND hDeviceWindow; / 设备窗口的句柄,对窗口模式可取为NULL(= 0) BOOL Windowed; / 应用程序在窗口/全屏中运行时取TRUE/FALSEBOOL EnableAutoDepthStenc

37、il; / 允许自动深度模板,为TRUE则由Direct3D/ 来管理应用程序的深度缓冲区D3DFORMAT AutoDepthStencilFormat; / 自动深度模板格式,可取/ D3DFMT_D16、D3DFMT_D24S8和D3DFMT_D32等枚举值 DWORD Flags; / 表现标志D3DPRESENTFLAG常数之一,可取为0 UINT FullScreen_RefreshRateInHz; / 全屏时的屏幕刷新率,对窗口模式必须为0UINT PresentationInterval; / 前后台缓冲区交换的最大速率,可取为 / D3DPRESENT_INTERVAL_D

38、EFAULT(= 0) D3DPRESENT_PARAMETERS;例如: / 设置创建D3D设备用的表现结构 D3DPRESENT_PARAMETERS d3dpp; / 定义表现结构变量 ZeroMemory( &d3dpp, sizeof(d3dpp) ); / 内存清零 d3dpp.Windowed = TRUE; / 窗口模式 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; / 放弃交换效果 d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; / 未知格式 d3dpp.EnableAutoDepthStencil =

39、TRUE; / 允许自动深度模板 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接口的

40、CreateDevice方法所返回的设备接口IDirect3DDevice9的指针,可以调用该接口的设置渲染(render着色)状态方法SetRenderState,来初始化设备:HRESULT SetRenderState( / 成功返回D3D_OK(= 0) D3DRENDERSTATETYPE State, / 设备状态 DWORD Value / 设置值);其中,设备状态State,可取D3DRENDERSTATETYPE枚举的任意值,如D3DRS_ZENABLE(允许Z缓冲)、D3DRS_FILLMODE(填充模式)、D3DRS_SHADEMODE(阴影模式)、 D3DRS_ALPH

41、ATESTENABLE(允许测试)、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.

42、2.4 创建场景三维场景是由若干物体(几何对象)构成的,复杂的几何对象由多个简单的图元(点、线、三角形和多边形等)所组成,而图元(primitive)又是顶点(vertex)的集合。图13-12 3D图元表面的三角网格3D图元一般是一个多面体,通常用其表面的三角网格来表示,参见图13-12。所以最基本的图元是三角形和顶点。创建场景中的几何对象,等价于建立表示该几何体的顶点集合。因此,必须先定义自己的顶点结构并创建顶点缓冲区,然后在锁定顶点缓冲区后,再通过给顶点缓冲区中的各顶点结构赋值来构造几何对象,最后解锁顶点缓冲区。l 定义顶点结构Direct3D使用一种FVF(Flexible Verte

43、x Format可变顶点格式)结构来定义顶点,以满足用户的不同需要。在FVF结构CUSTOMVERTEX中,可以包含描述顶点的位置、RHW(reciprocal homogeneous w倒数齐次w,表示已变换顶点位置的齐次坐标w分量)、法向、大小和(漫射、镜面反射)颜色等字段,具体内容由用户根据需要自己来确定,但是各字段之间的相对顺序不能改变。其中,顶点的位置和法向等字段,一般为三维点向量,可以用Direct3D的扩展三维向量结构D3DXVECTOR3来表示:typedef struct D3DXVECTOR3 FLOAT x; FLOAT y; FLOAT z; D3DXVECTOR3;其

44、中的FLOAT为float的typedef类型,定义在windef.h头文件中。而颜色一般采用DWORD的typedef定义类型D3DCOLOR。例如:struct CUSTOMVERTEX / 含位置、法向量和颜色的自定义顶点结构D3DXVECTOR3 position; / 未变换顶点的3D位置D3DXVECTOR3 normal; / 顶点的表面法向量 D3DCOLOR color; / 颜色; 或:struct CUSTOMVERTEX / 含位置、颜色和纹理坐标的自定义顶点结构 D3DXVECTOR3 position; / 未变换顶点的3D位置 D3DCOLOR color; /

45、颜色 FLOAT tu, tv; / 纹理坐标; 或:struct CUSTOMVERTEX / 含位置齐次坐标和颜色的自定义顶点结构FLOAT x, y, z, rhw; / 已变换顶点的3D位置 DWORD color; / 颜色;用户在定义了自己的顶点结构类型后,还需要定义一个对应的(宏)常量,来描述该结构的字段内容。该(宏)常量由若干表示顶点格式的标志位符号常量(参见表13-1)的位或组合而成。表13-1 顶点数据格式标志符号常量值数据类型描述D3DFVF_XYZ0x002float, float, float未转换的顶点坐标D3DFVF_XYZRHW0x004float, float

46、, float, float已转换的顶点坐标D3DFVF_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 (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE)或:#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)或:const DWORD FVF = (D3DFVF_XYZRHW | D3DFVF_DIFFUSE);l 创建顶点缓

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号