ImageVerifierCode 换一换
格式:DOC , 页数:29 ,大小:829.50KB ,
资源ID:6259073      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-6259073.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(设定Direct X应用程序中的Direct 3D.doc)为本站会员(gnk289057)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

设定Direct X应用程序中的Direct 3D.doc

1、4. 设定 Direct X 应用程序中的 Direct 3D现在进入有趣的部分!从现在起,我们将开始建立我们程序中的 Microsoft Direct3D 立即模式。在本章中,我们会先检查在立即模式中有哪些可用的对象和接口。然后我们会带您走过要建立一个立即模式程序框架的相关步骤。在读过 第三章 后,您应该对 DirectDraw 定义程序代码已经适应了。要记住,Direct3D 是一个指向 DirectDraw 对象的 COM 接口。因此Microsoft 把硬件抽像层(HAL)叫作 DirectDraw/Direct3D HAL。此外,Direct3D 利用DirectDraw 绘图页作为

2、前后缓冲区来显示 3D 场景和计算 3D 场景时的 z 缓冲区。另外,Direct3D 贴图是由 DirectDraw 绘图页所构成的,并且可以引用 DirectDraw 型态。Direct3D 立即模式对象和接口Direct3D 立即模式是由一些 COM 对象和连到这些对象的接口所构成的,您可以用这种模式来建构和控制您程序中的 3D 世界。在本段落中,我们会看到这些对象和他们的接口(以及一些 DirectDraw 对象和接口)。DirectDraw 物件和在 第三章 中您看到的一样,您可以用 DirectDrawCreateEx 函式来建立 DirectDraw 对象。DirectDrawC

3、reateEx 函式开启了 DirectX 7 最新的 DirectDraw 和 Direct3D 接口。您在任何Direct3D 应用程序中所建立的第一个对象一定是 DirectDraw 对象,因为它负责并提供显示装置的存取功能,如此才能实作许多 Direct3D 的功能。IDirectDraw7 是 DirectX 7 中连到DirectDraw 对象的最新版接口,而且它和之前版本有很大的不同。我们也会在本书中使用到它。DirectDrawSurface 物件在一个 Direct3D 程序中,可以用 DirectDrawSurface ( IDirectDrawSurface7 接口)对象

4、来建立前缓冲区、后缓冲区、贴图对映和深度缓冲区。绘图页则表示某块可能存在在您的视讯卡上或您的计算机标准系统内存中的内存。如果您用 DDSCAPS_3DDEVICE 特性位建立了一个 DirectDrawSurface 对象,您可以用IDirect3D7:CreateDevice,并配合绘图页来建立一个 Direct3D 装置对象,这个对象会用此绘图页作为它的绘制目标,这也是在建立后缓冲区时的一般作法。您也可以利用IDirectDraw7:CreateSurface 方法和 DDSCAPS_TEXTURE 旗标来建立一个拥有贴图功能的 DirectDrawSurface 对象。这个对象可以填入您

5、想用在场景中的对象贴图所用到的位图。Direct3DDevice 物件所谓 Direct3Device 对象是 Direct3D 的成像组件。它可以概括和储存立即模式应用程序的成像状态和一个可以运用该状态来计算基本形状的方法。所谓成像状态(rendering state)定义了绘制上用到的参数,包括了贴图、上色、色彩和烟雾。DirectX 7 中包含了IDirect3DDevice7 的接口所提供的装置对象模型。您可以用 IDirect3D7:CreateDevice 方法来建立 Direct3D 装置对象。这个呼叫动作也同时让您取得一个 IDirect3DDevice7 接口。而这个接口并不

6、会对材质、光源和检视埠使用不同的 COM 对象,这是和早期版本的 DirectX 不同之处。在 DirectX 7 中,这个新的接口包含了可提供这些新特性作为 Direct3D 装置内部数据结构的一些方法。在目标系统上可以建立以下几种 Direct3D 装置: HAL 装置。 TnLHAL 装置。 RGB 装置。 参照扫描成像装置(reference rasterizer device)。还有其它二种装置在 DirectX 的之前版本有提供 MMX 装置和连冲装置(ramp device),但在 DirectX 7 中不存在。HAL 装置是一个支持 Direct3D 的 3D 绘图器,提供了硬

7、件的扫描成像,但不提供转换和打光功能,(转换、打光和扫描成像会在后面两章有详细说明)。如果列举时有找到 HAL 装置,应该在您的程序中运用。但是如果您在开发程序时采纳了硬件转换和打光的优点时,TnLHAL 会是更好的选择。TnLHAL(TransformnLighting HAL)装置用硬盘来处理所有转换和打光以及扫描成像模块,而且显然也是最快速的装置类型。它和 HAL 的差异是在它执行硬件加速的转换和打光动作。因此,它可以减轻 CPU 的负载,明显加快应用程序的速度。您可以检查D3DEVCAPS_HWTRANSFORMANDLIGHT 装置特性来辨认某个装置有无提供硬件加速的转换和打光。RG

8、B 装置主要是用在不含任何硬件 3D 加速功能的系统上。RGB 装置可用软件仿真 3D 指令。这意谓着它会比用 HAL 装置执行速度慢得多,但是它可以利用系统 CPU 提供的特殊指令。这种扫描成像器会用到支持 MMX 指令集(某些 Intel 处理器适用),或者是 AMD 3DNow! (某些 AMD 处理器适用)来加速绘制。 MMX 指令集是用来加速扫描成像而3DNow!指令集则可加速转换和打光动作。但实时有了这些特殊指令集,RGB 装置还是比HAL 和 TnLHAL 慢。最后一种是参照扫描成像装置,这种绘制器支持所有的 Direct3D 功能,但是实作上是针对正确性作最佳化而非针对速度。因

9、此,参照扫描成像器相当地慢,您应该只用它来测试您的卡无法支持的 Direct3D 功能上。Direct3D 的默认值并不会列举扫描成像器。要列举它时,您首先必须使用 RegEdit,将HKEY_LOCAL_MACHINESOFTWAREMicrosoft Direct3DDrivers 下的记录值EnumReference 值设为一个非零的 DWORD 值。Direct3DVertexBuffer 物件这种对象是一个内存缓冲区,里面包含要用 IDirect3DDevice7 接口提供的顶点缓冲区绘制方法计算的顶点。使用 IDirect3D7:CreateVertexBuffer 方法可以建立顶

10、点缓冲区以及相关的存取接口。下一章会详细说明顶点和顶点缓冲区。建立一个立即模式应用程序要让您的程序用到 Direct3D 时,会包含以下的步骤,其中有一些在第三章就提过了。我会针对前五个步骤深入探讨一些额外的内容,并且描述建立 Direct3D 装置和深度缓冲区的最终过程。1.初始化应用程序。 2.辨认可用的 DirectX 版本(如果省略这个动作,本书的程序代码中假设 DirectX 7 可用)。 3.列举存在可用的 Direct3D 装置。 4.选择 Direct3D 装置。 5.利用 DirectDrawCreateEx 取得一个 IDirectDraw7 接口。 6.利用 IDirec

11、tDraw7 接口的 QueryInterface 方法来取得 IDirect3D7 接口,再建立一个Direct3D 装置。 7.列举深度缓冲区格式,建立一个深度缓冲区用来绘制您的 3D 世界。在本章中,您可以看到如何做到以上步骤和建立一个有效的 Direct3D 装置所需要的相关程序,让您可以绘制您的 3D 世界。我们先修改 第三章 提到的 CD3DFramework7:CreateEnvironment 程序来建立Direct3D、Direct3DDevice 和深度缓冲区对象。以下是这个程序修改过的版本:/-/名称:CreateEnvironment/说明:建立程序框架的内部对象/-H

12、RESULT CD3DFramework7:CreateEnvironment(GUID*pDriverGUID, GUID*pDeviceGUID, DDSURFACEDESC2*pMode, DWORD dwFlags)HRESULT hr;/依据装置为硬件装置或/软件装置而定,选择预设的内存型态。if(IsEqualIID(*pDeviceGUID,IID_IDirect3DHALDevice)m_dwDeviceMemType =DDSCAPS_VIDEOMEMORY;else if(IsEqualIID(*pDeviceGUID,IID_IDirect3DTnLHalDevice)m

13、_dwDeviceMemType =DDSCAPS_VIDEOMEMORY;elsem_dwDeviceMemType =DDSCAPS_SYSTEMMEMORY;/建立 DirectDraw 对象hr =CreateDirectDraw(pDriverGUID,dwFlags);if(FAILED(hr)return hr;/建立前后缓冲区,并加上裁切。if(dwFlags elsehr =CreateWindowedBuffers(pMode,dwFlags);if(FAILED(hr)return hr;/建立 Direct3D 对象和 Direct3DDevice 对象hr =Crea

14、teDirect3D(pDeviceGUID,dwFlags);if(FAILED(hr)return hr;/建立并附加上 z-缓冲区if(dwFlags if(FAILED(hr)return hr;return S_OK;我们会在本章稍后对这个程序增加其它的呼叫内容。依照您所建立的不同装置类型(HAL、RGB 等),您应该让软件选择您的主绘图页、贴图和顶点缓冲区所需要的内存型态,让您的程序发挥最好的效率。除了标准的视讯内存外,DirectDraw 支持加速图型端口(Accelerated Graphics Port, AGP)架构,允许在非本机视讯内存中建立绘图页。AGP 架构的作法有二

15、种:执行模型( execute model )和 DMA模型。在执行模型下,显示装置同时支持非本机(AGP)和本机(标准)视讯内存绘图页的同样功能。在 DMA 模型下,如果没有可用的本机视讯内存时,(除非您要求使用本机视讯内存),DirectDraw 会针对您建立的任何贴图绘图页使用非本机视讯内存。对其他的绘图页型态而言,绘图页只会建立在本机视讯内存中,除非您的程序需要使用非本机视讯内存。要辨别某种装置驱动程序是否支持非本机视讯内存绘图页的贴图,您可以看看D3DDEVCAPS_TEXTURENONLOCALVIDMEM 旗标值是否有被设定。您可以利用IDirect3DDevice7:GetCa

16、ps 方法取得 3D 装置特性清单,再从清单中取得该旗标值。步骤 1:初始化应用程序要在程序中建立 Direct3D 内容的第一个步骤是初始化所有相关的变量。这个步骤的主要目的是要清除所有的对象和结构,让您可以在您的 3D 世界中建立必要的对象和在结构中填入需要的设定值,例如上色参数和裁切。以下的 CD3DFramework7 建构元会初始化所有的成员变量,并定义某些项目(如 z 轴、后缓冲区和装置)。/-/名称:CD3DFramework7/说明:用来清除静态变量的建构元/-CD3DFramework7:CD3DFramework7()m_hWnd =NULL;m_bIsFullscreen

17、 =FALSE;m_bIsStereo =FALSE;m_dwRenderWidth =0L;m_dwRenderHeight =0L;m_pddsFrontBuffer =NULL;m_pddsBackBuffer =NULL;m_pddsBackBufferLeft =NULL;m_pddsZBuffer =NULL;m_pd3dDevice =NULL;m_pDD =NULL;m_pD3D =NULL;m_dwDeviceMemType =NULL;步骤 2: 决定 DirectX 版本辨别系统上已安装的 DirectX 版本的整个过程称为版本检查。您需要做到的版本检查程度依照您使用 D

18、irect3D 的方式而有不同。如果您有兴趣开发自己的系统,那么您大概已经安装了最新且最完整的 DirectX,因此不需再作检查。如果您正在撰写一个全新的 DirectX 7 应用程序,您应该会在产品中附上最新的 DirectX 执行时期函式库,您的安装程序也会顺便安装(如果系统环境是 Windows 95 或 Windows 98)。如果环境是 Microsoft Windows NT4或更早版本,您可以控制程序不要安装或执行。Windows 2000 出厂时已附有完整的DirectX 支持,所以如果系统环境是 Windows 2000 时,您的软件可以使用最新的 DirectX特性。大多数

19、公司出厂的 3D 游戏和其它软件会希望您已安装最新版 DirectX否则会在游戏安装过程中,再从同一片游戏光盘安装 DirectX。然而,如果您打算支持之前版本的 DirectX(为了某种理由),您必须作更精准的版本检查。您可能想避免在连结 ddraw.lib 而不是用 LoadLibrary 和 GetProcAddress 时,看到突然出现的标准错误讯息。如果您不想让使用者收到标准的系统错误讯息,请使用 QueryInterface作为需求接口,以一个错误讯息表示失败,并且结束程序。您的最佳作法是建立一个Windows 95 或 Windows 98 的安装程序,能够在安装过程中自动更新系

20、统为最新版的DirectX。然而,请记住,在 Windows NT 和 Windows 2000 中,只有系统管理者有权更新操作系统的重要部分(如 DirectX),因此您的安装程序无法更新 DirectX 版本。如果您希望使用版本检查的作法,好让您的软件能在多个平台上执行,您可以检查不同的DirectX 接口的可用性。试着检查从 DirectX 2 支持的接口到只有 DirectX 7 才支持的接口,您可以找出目前可用的 DirectX 版本。一旦找出确实可用的 DirectX 版本,您可以让程序完全享受到系统平台支持的所有功能的优点。如果系统平台的 DirectX 版本不及您需求的来得新,

21、您可以让软件本身适当的减少支持效果。比方说,如果您想要 DirectX 7,但只有DirectX 3 可用,您 0 可以停用多贴图,因为在 DirectX 3 中并不支持。依此作法可以让您的应用程序正常执行,只会牺牲一点视觉效果。然而上面也提过,您最好还是在系统平台上安装最新版的 DirectX,这样您的软件才能发挥它的实力。步骤 3: 列举现存可用的 Direct3D 装置要建立一个稍后可用来绘制的装置,首先您要列举出 Direct3D 装置。 第三章 提到,这样做意谓着先列举出 DirectDraw 装置,再列举出附属在每个 DirectDraw 装置上的所有 Direct3D装置。您可以

22、用第三章描述的 D3DEnum_EnumerateDevices 程序来做到这件事。步骤 4: 选择 Direct3D 装置要让您的程序能使用 Direct3D 的下一步骤包含了挑选最适用于程序需求的 Direct3D 装置,并且去建立该装置。处理这个选择动作和建立装置的原始程序的同时也要能判别是在全屏幕或窗口模式下执行。在第三章的 DeviceEnumCallback 程序中说明了整个动作。步骤 5: 取得一个 IDirectDraw7 界面在初始化您的变量及判别 DirectX 版本后,下一步就是要建立一个 DirectDraw 对象。 第三章 已详述了如何用 CD3DFramework7

23、:CreateDirectDraw 成员函式来取得新的IDirectDraw7 界面。步骤 6:从 IDirectDraw7 接口取得 IDirect3D7 接口并建立一个Direct3D 装置要建立一个 Direct3D 对象,您要用 DirectDraw 对象的 QueryInterface 方法来判定它是否支持 DirectX 7 所提供的 IID_IDirect3D7 接口,如果 DirectDraw 对象支持该接口,QueryInterface 会取得一个指到该接口的指针并且呼叫 AddRef 来累加此参照。以下的 d3dframe.cpp 程序说明了如何建立 Direct3D 对象

24、和 Direct3DDevice 对象。(我们会在 第五章 中讨论这个程序的最后一段:建立一个检视埠)/-/名称:CreateDirect3D/说明:建立 Direct3D 接口/-HRESULT CD3DFramework7:CreateDirect3D(GUID*pDeviceGUID)/查询 DirectDraw 以存取 Direct3D。if(FAILED(m_pDD-QueryInterface(IID_IDirect3D7, (VOID*)return D3DFWERR_NODIRECT3D;/建立装置。if(FAILED(m_pD3D-CreateDevice(*pDeviceG

25、UID,m_pddsBackBuffer, return D3DFWERR_NO3DDEVICE;/设定新建立的装置的检视端口。D3DVIEWPORT7 vp =0,0,m_dwRenderWidth,m_dwRenderHeight, 0.0f,1.0f;if(FAILED(m_pd3dDevice-SetViewport(return D3DFWERR_NOVIEWPORT;return S_OK;一旦这个程序成功地回传,您就拥有了一个有效的 Direct3D 物件和一个有效的 Direct3D 装置对象,可以用在应用程序中。建立 Direct3D 装置在本章的前面,您曾经看过可用的 Di

26、rect3D 装置类型。在 DirectX 7 中,只要呼叫IDirect3D7:CreateDevice 方法即可取得 IDirect3DDevice7 接口,其中即包含了支持材质、光源和视埠的方法,而不是像之前版本的 DirectX 需要取得不同的Direct3DLight、Direct3DMaterial 和 Direct3DViewport 物件。我们曾讨论过,您建立的装置必须对应系统平台上的可用功能。Direct3D 利用计算机的 3D硬件或软件仿真 3D 特性的方式提供了绘制功能,也就是同时提供硬件存取和软件仿真。您应该在设计软件时尽可能地使用硬件功能而非软件仿真,因为硬件执行速度

27、较快。记住,软件装置未必支持硬件装置所有支持的特性。因此,您应该查询装置的特性来找出硬件支持的部分,而在缺少硬件加速卡的系统上再使用软件仿真。HAL 和 TnLHAL 装置皆属于硬件加速,您应该多加利用。Direct3D 应用程序利用 Direct3D方法和 HAL 来存取 3D 硬件。如果系统里有一片 Direct3D 功能的 3D 硬件加速卡,您应该将它用在硬件实作的 Direct3D 功能上。如果没有可用的硬件加速时,RGB 装置(它会试着利用 MMX)则是次佳的选择。RGB 装置是一种软件扫描成像器,所以它会比硬件加速装置来得慢。然而,RGB 装置可以运用现有的 CPU 延伸功能,例如

28、 MMX、3DNOW!和Katmai,来尽可能地加快执行速度。取得各种装置类型的呼叫指令如下:CreateDevice(IID_IDirect3DTnLHalDevice,lpDirectDrawSurface, lplpDirect3DDevice);CreateDevice(IID_IDirect3DHALDevice,lpDirectDrawSurface, lplpDirect3DDevice);CreateDevice(IID_IDirect3DRGBDevice,lpDirectDrawSurface, lplpDirect3DDevice);CreateDevice(IID_ID

29、irect3DRefDevice,lpDirectDrawSurface, lplpDirect3DDevice);IDirect3DDevice7 界面的成员函式 IDirect3DDevice7:GetCaps,会取得所有 Direct3D 装置的特性。这个方法会将描述这些特性的数据存入 D3DDEVICEDESC7 结构中。D3DDEVICEDESC7 结构的定义如下:typedef struct _D3DDeviceDesc7 DWORD dwDevCaps;/装置特性D3DPRIMCAPS dpcLineCaps;D3DPRIMCAPS dpcTriCaps;DWORD dwDevi

30、ceRenderBitDepth;/DDBB_8,16,等中的任一种DWORD dwDeviceZBufferBitDepth;/DDBD_16,32,等中的任一种DWORD dwMinTextureWidth,dwMinTextureHeight;DWORD dwMaxTextureWidth,dwMaxTextureHeight;DWORD dwMaxTextureRepeat;DWORD dwMaxTextureAspectRatio;DWORD dwMaxAnisotropy;D3DVALUE dvGuardBandLeft;D3DVALUE dvGuardBandTop;D3DVAL

31、UE dvGuardBandRight;D3DVALUE dvGuardBandBottom;D3DVALUE dvExtentsAdjust;DWORD dwStencilCaps;DWORD dwFVFCaps;DWORD dwTextureOpCaps;WORD wMaxTextureBlendStages;WORD wMaxSimultaneousTextures;DWORD dwMaxActiveLights;D3DVALUE dvMaxVertexW;GUID deviceGUID;WORD wMaxUserClipPlanes;WORD wMaxVertexBlendMatric

32、es;DWORD dwVertexProcessingCaps;DWORD dwReserved1;DWORD dwReserved2;DWORD dwReserved3;DWORD dwReserved4;D3DDEVICEDESC7,*LPD3DDEVICEDESC7;这个结构的成员定义如下: dwDevCaps 包含了辨认装置特性的旗标。 dpcLineCaps 和 dpcTriCaps D3DPRIMCAPS 结构中定义该装置支持了画线和三角形基本形状。 dwDeviceRenderBitDepth 装置的绘制位深度(rendering bit depth)。本成员可能是一个或多个 D

33、irectDraw 位深度常数(如 DDBD_8、DDBD_16、DDBD_24 或DDBD_32)。 dwDeviceZBufferBitDepth 代表装置的深度缓冲区位深度,本成员可能是一个或多个 DirectDraw 位深度(如 DDBD_8、DDBD_16 、DDBD_24 或 DDBD_32)。 dwMinTextureWidth、dwMinTextureHeight 代表装置的最小贴图宽度和高度。 dwMaxTextureWidth、dwMaxTextureHeight 代表装置的最大贴图宽度和高度。 dwMaxTextureRepeat 包含了后正规化贴图索引(postnorm

34、alized texture indices)的整数(非分数)位的全部范围。如果D3DDEVCAPS_TEXREPEATNOTSCALEDBYSIZE 位值被设定,装置会延迟贴图尺寸的缩放,一直套用到贴图地址模式为止。如果未设定时,装置会在内插前先依据贴图尺寸(细部的最大程度)去缩放贴图索引。 dwMaxTextureAspectRatio 表示硬件支持的最大贴图比例; 本值通常是 2 的幂方。 dwMaxAnisotropy 代表 D3DRENDERSTATE_ANISOTROPY 绘图状态的最大有效值。 dvGuardBandLeft、dvGuardBandTop、dvGuardBandR

35、ight 和dvGuardBandBottom 定义监视 guard-band 裁切区域的屏幕空间坐标。落在此区块内但不在检视埠区内的坐标会自动被裁切。 dvExtentsAdjust 要让延伸区向外扩展以容纳柔边核心时所需要调整的像素数目。 dwStencilCaps 包含了哪些可支持屏蔽缓冲区( stencil-buffer)作业的旗标。 dwFVFCaps 代表弹性顶点格式特性。 dwTextureOpCaps 包含了各种旗标值的组合,这些旗标值是用来描述装置所支持的贴图指令。 wMaxTextureBlendStages 表示装置支持的最大贴图混合阶层(texture blending

36、 stages)。 wMaxSimultaneousTextures 表示可同时附加在装置的贴图连缩阶层上的贴图最大值。 dwMaxActiveLights 表示可以同时发生作用的最大光源数。 dvMaxVertexW 表示装置可支持的最大 w 深度值。 deviceGUID 表示可辨识该装置的 GUID。 wMaxUserClipPlanes 表示装置支持的使用者定义裁切面的最大值。这个成员的范围值可以从 0 到 D3DMAXUSERCLIPPLANES。利用IDirect3DDevice7:GetClipPlane 和 IDirect3DDevice7:SetClipPlane 方法可以控

37、制使用者定义裁切面。 wMaxVertexBlendMatrices 表示当执行多矩阵顶点混色( multimatrix vertex blending)时,装置可以应用的最多矩阵数目。 dwVertexProcessingCaps 表示装置的顶点处理。 dwReserved1 到 dwReserved4 保留用途。您可以看得出来,这里提供了许多的特性。您必须依您的程序需求决定要检查哪些项目。不过,您应该尽可能地多运用他们,以创造出更真实的 3D 环境。举例来说,本书所提到的RoadRage 程序用到了烟雾和 混色来提供尽可能真实的成像和动态 3D 世界。您也需要提供使用者管道来挑选其它可用的

38、装置(或模式),这样他/她才能去改变初始的默认值(例如,RGB vs. HAL;全屏幕 vs. 窗口模式;一个较低分辨率模式,如 800600 vs. 640480;等等)。以下的程序会去处理当使用者从 File 菜单选择改变装置/模式的动作。它产生一个对话盒包括了可用的装置和模式,允许使用者挑选想要的装置和模式,并且切换过去。这里是一些需要加入档案 d3dapp.cpp 中的 CD3DApplication:MsgProc 成员函式的程序代码,来处理使用者选择菜单的动作:case IDM_CHANGEDEVICE:/显示选择装置的对话盒if (m_bActive if (SUCCEEDED(

39、D3DEnum_UserChangeDevice(Pause(FALSE);return 0;图 4-1 表示在选择一个新装置或模式时,程序会产生一个下拉式菜单。图 4-1 选择新装置或模式图 4-2 则是当使用者作了选择之后程序所产生的对话盒。使用者可以挑选想要的装置(例如,主要装置或是其它辅助装置)和模式。图 4-2 Change Device 对话盒本章中新增到 CD3DApplication:MsgProc 成员函式中的新 case 指令,会去呼叫D3DEnum_UserChangeDevice 来产生一个对话盒显示所有系统可用的装置和模式,并且可让使用者挑选一个新的。参考上面的图,对

40、话盒的上方会有一个清单方块列出每一个装置,而对话盒的下方会有一个清单方块列出所有模式。 D3DEnum_UserChangeDevice 程序如下:/-/名称:D3DEnum_UserChangeDevice/说明:跳出一个对话盒让使用者选择/ 新装置/-HRESULT D3DEnum_UserChangeDevice(D3DEnum_DeviceInfo*ppDevice)if(IDOK =DialogBoxParam(HINSTANCE)GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_CHANGEDEVICE),GetForegroundWindow(

41、), ChangeDeviceProc,(LPARAM)ppDevice)return S_OK;return E_FAIL;这个程序会呼叫 Windows DialogBoxParam 函式,并从您所指定的对话盒范本资源中建立一个典型的对话盒。它会用到一个回传函式在 lpDialogFunc 参数中。除非回传函式呼叫 EndDialog 函式来终止这个典型的对话盒,否则这个典型的对话盒不会传回控制权。呼叫 DialogBoxParam 时所指定的 ChangeDeviceProc 回传会处理在这个装置选择对话盒中的所有 Windows 讯息。/-/名称:ChangeDeviceProc/说明

42、:选择装置对话盒的 Windows 讯息处理函式/-static BOOL CALLBACK ChangeDeviceProc(HWND hDlg,UINT uiMsg,WPARAM wParam,LPARAM lParam)static D3DEnum_DeviceInfo*ppDeviceArg;static D3DEnum_DeviceInfo*pCurrentDevice;static DWORD dwCurrentMode;static BOOL bCurrentWindowed;static BOOL bCurrentStereo;/取得对列举装置清单的存取权D3DEnum_Dev

43、iceInfo*pDeviceList;DWORD dwNumDevices;D3DEnum_GetDevices(/处理初始化讯息if(WM_INITDIALOG =uiMsg)/Get the application s current device,passed in as an/lParam argument.ppDeviceArg =(D3DEnum_DeviceInfo*)lParam;if(NULL =ppDeviceArg)return FALSE;/设定对话盒的暂时储存指标pCurrentDevice =(*ppDeviceArg);dwCurrentMode =pCurre

44、ntDevice-dwCurrentMode;bCurrentWindowed =pCurrentDevice-bWindowed;bCurrentStereo =pCurrentDevice-bStereo;UpdateDialogControls(hDlg,pCurrentDevice,dwCurrentMode,bCurrentWindowed,bCurrentStereo);return TRUE;else if(WM_COMMAND=uiMsg)HWND hwndDevice =GetDlgItem(hDlg,IDC_DEVICE_COMBO);HWND hwndMode =GetD

45、lgItem(hDlg,IDC_MODE_COMBO);HWND hwndWindowed =GetDlgItem(hDlg,IDC_WINDOWED_CHECKBOX);HWND hwndStereo =GetDlgItem(hDlg,IDC_STEREO_CHECKBOX);/取得目前使用者的接口状态。DWORD dwDevice =ComboBox_GetCurSel(hwndDevice);DWORD dwModeItem =ComboBox_GetCurSel(hwndMode);DWORD dwMode =ComboBox_GetItemData(hwndMode,dwModeIt

46、em);BOOL bWindowed =hwndWindowed ?Button_GetCheck(hwndWindowed):0;BOOL bStereo =hwndStereo ?Button_GetCheck(hwndStereo):0;D3DEnum_DeviceInfo*pDevice =if(IDOK =LOWORD(wParam)/处理当使用者按下 Ok 时的状况。检查/使用者是否改变任何选项。if(pDevice !=pCurrentDevice|dwMode !=dwCurrentMode|bWindowed !=bCurrentWindowed|bStereo !=bCur

47、rentStereo)/传回新选择的装置及/其新属性。(*ppDeviceArg)=pDevice;pDevice-bWindowed =bWindowed;pDevice-bStereo =bStereo;pDevice-dwCurrentMode =dwMode;pDevice-ddsdFullscreenMode =pDevice-pddsdModes dwMode;EndDialog(hDlg,IDOK);elseEndDialog(hDlg,IDCANCEL);return TRUE;else if(IDCANCEL =LOWORD(wParam)/处理当使用者按下 Cancel 时的状况。EndDialog(hDlg,IDCANCEL);return TRUE;els

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报