4. 设定Direct X应用程序中的Direct 3D
现在进入有趣的部分!从现在起,我们将开始建立我们程序中的Microsoft Direct3D立即模式。在本章中,我们会先检查在立即模式中有哪些可用的对象和接口。然后我们会带您走过要建立一个立即模式程序框架的相关步骤。在读过 第三章 后,您应该对DirectDraw定义程序代码已经适应了。要记住,Direct3D是一个指向DirectDraw对象的COM接口。因此Microsoft把硬件抽像层(HAL)叫作DirectDraw/Direct3D HAL。此外,Direct3D利用DirectDraw绘图页作为前后缓冲区来显示3D场景和计算3D场景时的z缓冲区。另外,Direct3D贴图是由DirectDraw绘图页所构成的,并且可以引用DirectDraw型态。
Direct3D立即模式对象和接口
Direct3D立即模式是由一些COM对象和连到这些对象的接口所构成的,您可以用这种模式来建构和控制您程序中的3D世界。在本段落中,我们会看到这些对象和他们的接口(以及一些DirectDraw对象和接口)。
DirectDraw物件
和在 第三章 中您看到的一样,您可以用DirectDrawCreateEx函式来建立DirectDraw对象。DirectDrawCreateEx函式开启了DirectX 7最新的DirectDraw和Direct3D接口。您在任何Direct3D应用程序中所建立的第一个对象一定是DirectDraw对象,因为它负责并提供显示装置的存取功能,如此才能实作许多Direct3D的功能。IDirectDraw7是DirectX 7中连到DirectDraw对象的最新版接口,而且它和之前版本有很大的不同。我们也会在本书中使用到它。
DirectDrawSurface物件
在一个Direct3D程序中,可以用DirectDrawSurface ( IDirectDrawSurface7接口)对象来建立前缓冲区、后缓冲区、贴图对映和深度缓冲区。绘图页则表示某块可能存在在您的视讯卡上或您的计算机标准系统内存中的内存。
如果您用DDSCAPS_3DDEVICE特性位建立了一个DirectDrawSurface对象,您可以用IDirect3D7::CreateDevice,并配合绘图页来建立一个Direct3D装置对象,这个对象会用此绘图页作为它的绘制目标,这也是在建立后缓冲区时的一般作法。您也可以利用
IDirectDraw7::CreateSurface方法和DDSCAPS_TEXTURE旗标来建立一个拥有贴图功能的DirectDrawSurface对象。这个对象可以填入您想用在场景中的对象贴图所用到的位图。
Direct3DDevice物件
所谓Direct3Device对象是Direct3D的成像组件。它可以概括和储存立即模式应用程序的「成像状态」和一个可以运用该状态来计算基本形状的方法。所谓成像状态(rendering state)定义了绘制上用到的参数,包括了贴图、上色、色彩和烟雾。DirectX 7中包含了IDirect3DDevice7的接口所提供的装置对象模型。
您可以用IDirect3D7::CreateDevice方法来建立Direct3D装置对象。这个呼叫动作也同时让您取得一个IDirect3DDevice7接口。而这个接口并不会对材质、光源和检视埠使用不同的COM对象,这是和早期版本的DirectX不同之处。在DirectX 7中,这个新的接口包含了可提供这些新特性作为Direct3D装置内部数据结构的一些方法。 在目标系统上可以建立以下几种Direct3D装置: ? HAL装置。
? TnLHAL装置。
? RGB装置。
? 参照扫描成像装置(reference rasterizer device)。
还有其它二种装置在DirectX的之前版本有提供-MMX装置和连冲装置(ramp device),但在DirectX 7中不存在。
HAL装置是一个支持Direct3D的3D绘图器,提供了硬件的扫描成像,但不提供转换和打光功能,(转换、打光和扫描成像会在后面两章有详细说明)。如果列举时有找到HAL装置,应该在您的程序中运用。但是如果您在开发程序时采纳了硬件转换和打光的优点时,TnLHAL会是更好的选择。
TnLHAL(Transform'n'Lighting HAL)装置用硬盘来处理所有转换和打光以及扫描成像模块,而且显然也是最快速的装置类型。它和HAL的差异是在它执行硬件加速的转换和打光动作。因此,它可以减轻CPU的负载,明显加快应用程序的速度。您可以检查
D3DEVCAPS_HWTRANSFORMANDLIGHT装置特性来辨认某个装置有无提供硬件加速的转换和打光。
RGB装置主要是用在不含任何硬件3D加速功能的系统上。RGB装置可用软件仿真3D指令。这意谓着它会比用HAL装置执行速度慢得多,但是它可以利用系统CPU提供的特殊指令。这种扫描成像器会用到支持MMX指令集(某些Intel处理器适用),或者是AMD 3DNow! (某些AMD处理器适用)来加速绘制。MMX指令集是用来加速扫描成像而3DNow!指令集则可加速转换和打光动作。但实时有了这些特殊指令集,RGB装置还是比HAL和TnLHAL慢。
最后一种是参照扫描成像装置,这种绘制器支持所有的Direct3D功能,但是实作上是针对正确性作最佳化而非针对速度。因此,参照扫描成像器相当地慢,您应该只用它来测试您的卡无法支持的Direct3D功能上。
Direct3D的默认值并不会列举扫描成像器。要列举它时,您首先必须使用RegEdit,将HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft \\Direct3D\\Drivers下的记录值EnumReference值设为一个非零的DWORD值。
Direct3DVertexBuffer物件
这种对象是一个内存缓冲区,里面包含要用IDirect3DDevice7接口提供的顶点缓冲区绘制方法计算的顶点。使用IDirect3D7::CreateVertexBuffer方法可以建立顶点缓冲区以及相关的存取接口。下一章会详细说明顶点和顶点缓冲区。
建立一个立即模式应用程序
要让您的程序用到Direct3D时,会包含以下的步骤,其中有一些在第三章就提过了。我会针对前五个步骤深入探讨一些额外的内容,并且描述建立Direct3D装置和深度缓冲区的最终过程。
1. 初始化应用程序。
2. 辨认可用的DirectX版本(如果省略这个动作,本书的程序代码中假设DirectX 7可
用)。
3. 列举存在可用的Direct3D装置。 4. 选择Direct3D装置。
5. 利用DirectDrawCreateEx取得一个IDirectDraw7接口。
6. 利用IDirectDraw7接口的QueryInterface方法来取得IDirect3D7接口,再建立一个
Direct3D装置。
7. 列举深度缓冲区格式,建立一个深度缓冲区用来绘制您的3D世界。
在本章中,您可以看到如何做到以上步骤和建立一个有效的Direct3D装置所需要的相关程序,让您可以绘制您的3D世界。
我们先修改 第三章 提到的CD3DFramework7::CreateEnvironment程序来建立Direct3D、Direct3DDevice和深度缓冲区对象。以下是这个程序修改过的版本:
//-------------------------------------------------------------------
//名称:CreateEnvironment //说明:建立程序框架的内部对象
//-------------------------------------------------------------------
HRESULT CD3DFramework7::CreateEnvironment(GUID*pDriverGUID, GUID*pDeviceGUID, DDSURFACEDESC2*pMode, DWORD dwFlags) {
HRESULT hr;
//依据装置为硬件装置或
//软件装置而定,选择预设的内存型态。
if(IsEqualIID(*pDeviceGUID,IID_IDirect3DHALDevice)) else
m_dwDeviceMemType =DDSCAPS_SYSTEMMEMORY;
//建立DirectDraw对象
hr =CreateDirectDraw(pDriverGUID,dwFlags); if(FAILED(hr))
return hr;
//建立前后缓冲区,并加上裁切。 if(dwFlags &D3DFW_FULLSCREEN)
hr =CreateFullscreenBuffers(pMode,dwFlags); m_dwDeviceMemType =DDSCAPS_VIDEOMEMORY; m_dwDeviceMemType =DDSCAPS_VIDEOMEMORY;
else if(IsEqualIID(*pDeviceGUID,IID_IDirect3DTnLHalDevice))
}
else
hr =CreateWindowedBuffers(pMode,dwFlags); return hr;
if(FAILED(hr))
//建立Direct3D对象和Direct3DDevice对象 hr =CreateDirect3D(pDeviceGUID,dwFlags); if(FAILED(hr))
return hr;
//建立并附加上z-缓冲区 if(dwFlags &D3DFW_ZBUFFER)
hr =CreateZBuffer(pDeviceGUID,dwFlags); if(FAILED(hr))
return hr;
return S_OK;
我们会在本章稍后对这个程序增加其它的呼叫内容。
依照您所建立的不同装置类型(HAL、RGB等),您应该让软件选择您的主绘图页、贴图和顶点缓冲区所需要的内存型态,让您的程序发挥最好的效率。除了标准的视讯内存外,DirectDraw支持加速图型端口(Accelerated Graphics Port, AGP)架构,允许在非本机视讯内存中建立绘图页。AGP架构的作法有二种:执行模型( execute model )和DMA模型。在执行模型下,显示装置同时支持非本机(AGP)和本机(标准)视讯内存绘图页的同样功能。在DMA模型下,如果没有可用的本机视讯内存时,(除非您要求使用本机视讯内存),DirectDraw会针对您建立的任何贴图绘图页使用非本机视讯内存。对其他的绘图页型态而言,绘图页只会建立在本机视讯内存中,除非您的程序需要使用非本机视讯内存。
要辨别某种装置驱动程序是否支持非本机视讯内存绘图页的贴图,您可以看看D3DDEVCAPS_TEXTURENONLOCALVIDMEM旗标值是否有被设定。您可以利用IDirect3DDevice7::GetCaps方法取得3D装置特性清单,再从清单中取得该旗标值。
步骤1:初始化应用程序
要在程序中建立Direct3D内容的第一个步骤是初始化所有相关的变量。这个步骤的主要目的是要清除所有的对象和结构,让您可以在您的3D世界中建立必要的对象和在结构中填入
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新IT计算机设定Direct X应用程序中的Direct 3D 全文阅读和word下载服务。
相关推荐: