第2章DirectX编程

上传人:仙*** 文档编号:218832523 上传时间:2023-06-22 格式:PPT 页数:33 大小:829KB
返回 下载 相关 举报
第2章DirectX编程_第1页
第1页 / 共33页
第2章DirectX编程_第2页
第2页 / 共33页
第2章DirectX编程_第3页
第3页 / 共33页
点击查看更多>>
资源描述
第2章 Direct3D初始化 n主要目标:了解Direct3D与硬件图形设备之间的关系。了解Direct3D中组件对象模型(COM)所扮演的角色。学习基本的图形学概念,例如二维图片的存储、页面翻转及深度缓冲等概念。初始化Direct3D。熟悉本书示例中所使用的程序结构。22.1 Direct3D体系结构nDirect3D是一个图形应用程序的底层接口是一个图形应用程序的底层接口(API),通,通过该接口可以直接使用硬件的过该接口可以直接使用硬件的3D加速性能来渲染三维加速性能来渲染三维场景,可以认为场景,可以认为Direct3D是应用程序和硬件设备之间是应用程序和硬件设备之间的一个中间媒介。的一个中间媒介。n图图2.1展示了应用程序、展示了应用程序、Direct3D和硬件设备之间的层和硬件设备之间的层次关系。次关系。nDirect3D不能直接和硬件设备打交道的原因是微型计不能直接和硬件设备打交道的原因是微型计算机拥有各种各样的显卡,每种显卡的能力都不一样,算机拥有各种各样的显卡,每种显卡的能力都不一样,而且它们对相同功能的实现方式也不一样。而且它们对相同功能的实现方式也不一样。图图2.132.1.1 REF设备n如果使用在如果使用在Direct3D中提供了、但是硬件不支中提供了、但是硬件不支持的特性。持的特性。Direct3D提供参考光栅处理功能提供参考光栅处理功能(REF),它使用软件模拟的方法来实现整个,它使用软件模拟的方法来实现整个Direct3D中的中的 API。n如果你的显卡不支持,就可以用如果你的显卡不支持,就可以用REF设备来实设备来实现。只有程序开发者才有必要去深入地了解现。只有程序开发者才有必要去深入地了解REF设备,当程序和设备,当程序和DirectX SDK一起出售时一起出售时没有必要告诉最终用户需不需要使用没有必要告诉最终用户需不需要使用REF设备。设备。由于由于REF通过软件模拟硬件功能,所以速度很通过软件模拟硬件功能,所以速度很慢,在实际的应用中很少用到。慢,在实际的应用中很少用到。42.1.2 D3D设备类型D3DDEVTYPED3DDEVTYPE_HAL 由硬件实现功能由硬件实现功能D3DEVTYPE_REF 由软件模拟实现功能由软件模拟实现功能D3DDEVTYPE为枚举类型,硬件初始化后其值为:为枚举类型,硬件初始化后其值为:52.2 组件对象模型n组件对象模型组件对象模型(Component Object Model,COM)使使DirectX具有了具有了语言无关性语言无关性和和向后兼容性向后兼容性。n当使用当使用C+编写编写DirectX的应用程序的时候,许多的应用程序的时候,许多 COM组件方法和属性都可以直接调用。在组件方法和属性都可以直接调用。在COM技术技术中可以通过特殊的函数或者中可以通过特殊的函数或者COM组件的某个接口来得组件的某个接口来得到另外一个到另外一个COM组件的接口。组件的接口。n另外,当完成某个接口的操作而需要释放它们的时候,另外,当完成某个接口的操作而需要释放它们的时候,需要用需要用Release方法而不是用方法而不是用delete操作来完成释放操作来完成释放(所有的所有的COM组件都从一个组件都从一个IUknown接口继承,而在接口继承,而在IUknown接口中已经提供了接口中已经提供了Release方法方法)。62.3 预 备 知 识n要了解要了解Direct3D的初始化过程,的初始化过程,需要熟悉基本的图形学概念和相需要熟悉基本的图形学概念和相关的关的Direct3D数据类型。数据类型。n相关概念和数据类型,相关概念和数据类型,Direct3D的初始化。的初始化。72.3.1 表面缓冲区(Surface)n表面缓冲区表面缓冲区(Surface)是像素的矩阵,是像素的矩阵,Direct3D主要使用表面缓冲区来存主要使用表面缓冲区来存储二维图像的数据。储二维图像的数据。n在图在图2.2中,给出了表面缓冲区相关中,给出了表面缓冲区相关数据的定义。数据的定义。nPitch存储区是一个比表面缓冲区大存储区是一个比表面缓冲区大的存储区域,表面缓冲区是的存储区域,表面缓冲区是Pitch存存储区的一部分。储区的一部分。表面缓冲区的宽度和高度以像素为单位表面缓冲区的宽度和高度以像素为单位 Pitch存储区以字节为单位存储区以字节为单位图图2.282.3.1 表面缓冲区(Surface)n在在Direct3D中,用中,用IDirect3DSurface9接口来表示表面缓接口来表示表面缓冲区。该接口提供了直接对表面缓冲区进行读写的方法,冲区。该接口提供了直接对表面缓冲区进行读写的方法,其中主要的几个方法为:其中主要的几个方法为:LockRect 通过调用这个方法,可以锁定表面缓冲区并得到一个指向表面缓冲区的指针。在获得表面缓冲区指针后,可以通过指针偏移来读写需要的像素数据。UnlockRect 通过LockRect锁定表面缓冲区后,通过该方法解除对表面缓冲区内存区域的锁定。GetDesc 填充一个用来描述表面缓冲区数据信息的D3DSURFACE_DESC结构,从而获得表面缓冲区的信息。92.3.2 重采样n重采样技术是指通过像素矩阵来描述图像时使图像更重采样技术是指通过像素矩阵来描述图像时使图像更加平滑的技术。重采样技术常常用于屏幕抗锯齿操作。加平滑的技术。重采样技术常常用于屏幕抗锯齿操作。采用重采样技术和不采用重采样技术描述图像时的差采用重采样技术和不采用重采样技术描述图像时的差别。别。图图2.3采用重采样采用重采样不采用重采样不采用重采样102.3.2 重采样nD3DMULTISAMPLE_TYPE包含用来指定重采样级别包含用来指定重采样级别的枚举值,其主要枚举值包括:的枚举值,其主要枚举值包括:D3DMULTISAMPLE_NONE 不进行重采样。D3DMULTISAMPLE_1_SAMPLE D3DMULTISAMPLE_16_SAMPLE 指定16个不同的重采样级别,每个级别都对应了不同的效果。n本书中的程序基本上都没有用重采样技术,因为本书中的程序基本上都没有用重采样技术,因为采用采用重采样技术后将降低程序的执行速度重采样技术后将降低程序的执行速度。如果需要启动。如果需要启动重采样技术,要首先调用重采样技术,要首先调用IDirect3D9:CheckDeviceMultiSampleType方法检方法检测显卡是否支持重采样技术,然后设定重采样技术的测显卡是否支持重采样技术,然后设定重采样技术的级别。级别。112.3.3 像素格式n常用的常用的D3DFORMAT类型的部分枚举值:类型的部分枚举值:D3DFMT_R8G8B8 指定像素采用24位数据格式进行描述。D3DFMT_X8R8G8B8 指定像素使用该32位像素格式。D3DFMT_A8R8G8B8 指定像素采用该32位像素格式。D3DFMT_A16R16G16B16 指定像素使用该64像素格式。122.3.4 存储池n表面缓冲区和其他表面缓冲区和其他Direct3D资源都可以被放在资源都可以被放在各式的存储池中,通过各式的存储池中,通过D3DPOOL类型的枚举类型的枚举值可以指定不同的存储池,目前可以用的存储值可以指定不同的存储池,目前可以用的存储池主要有:池主要有:D3DPOOL_DEFAULT 默认存储池 D3DPOOL_MANAGED 托管存储池 D3DPOOL_SYSTEMMEM 系统存储池 D3DPOOL_SCRATCH SCRATCH存储池 132.3.5 交换链和页面翻转nDirect3D维护着一组表面缓冲区,通常有两个维护着一组表面缓冲区,通常有两个或者三个,通常将这组表面缓冲区的组合叫作或者三个,通常将这组表面缓冲区的组合叫作交换链交换链,通过,通过IDirect3DSwapChain9可以对交可以对交换链进行管理。换链进行管理。n交换链,更准确的说法是交换链,更准确的说法是页面翻转技术页面翻转技术,主要,主要用途是在播放动画的时候使帧和帧间的交换变用途是在播放动画的时候使帧和帧间的交换变得更加流畅。图得更加流畅。图2.4中展示了具有两个表面缓冲中展示了具有两个表面缓冲区的交换链。区的交换链。142.3.5 交换链和页面翻转n图图2.5表现了在表现了在Presenting操作前后的交换链。操作前后的交换链。n渲染图形的代码结构变为:渲染图形的代码结构变为:(1)将显示数据渲染到后缓冲区。(2)进行Presenting操作,交换前后缓冲区。(3)Goto(1)152.3.6 深度缓冲区n深度缓冲区也是一个表面缓冲区,但是在深度深度缓冲区也是一个表面缓冲区,但是在深度缓冲区中不是保存图片信息,而是缓冲区中不是保存图片信息,而是保存着每个保存着每个像素点对应的深度信息像素点对应的深度信息。n图图2.6展示了一个简单的场景,在这里部分物体展示了一个简单的场景,在这里部分物体遮挡了在其后的物体。遮挡了在其后的物体。Direct3D中使用深度缓中使用深度缓冲冲(也称为也称为Z缓冲缓冲)技术来进行技术来进行可见面的判断可见面的判断。162.3.6 深度缓冲区n深度缓冲区的大小格式决定了深度测试的准确性。比深度缓冲区的大小格式决定了深度测试的准确性。比如,如,24位的深度缓冲区比位的深度缓冲区比16位的准确性高。位的准确性高。n通常在通常在24位的深度缓冲格式下,程序就可以运行得很位的深度缓冲格式下,程序就可以运行得很好,但好,但Direct3D还是提供了还是提供了32位的深度缓存区:位的深度缓存区:D3DFMT_D32 指定一个32位的深度缓存区。D3DFMT_D24S8 指定一个24位的深度缓存区,其中8位预定为模板缓存。D3DFMT_D24X8 指定一个24位的深度缓存区。D3DFMT_D24X4S4 指定一个24位的深度缓存区,4位作为模板缓存。D3DFMT_D16 指定一个16位的深度缓冲区。172.3.7 顶点处理n顶点是组成顶点是组成3D空间的基本元素,在空间的基本元素,在Direct3D中中对顶点的处理有两种方法,即对顶点的处理有两种方法,即软件处理方法软件处理方法和和硬件处理方法硬件处理方法。n软件顶点处理在任何配置下都是被支持的,并软件顶点处理在任何配置下都是被支持的,并且也都可用;但是硬件顶点处理只有在显卡支且也都可用;但是硬件顶点处理只有在显卡支持硬件顶点处理的情况下才可以使用。持硬件顶点处理的情况下才可以使用。182.3.8 设备性能nDirect3D提供的所有特性在提供的所有特性在D3DCAPS9结构中结构中都有对应的数据成员或对应位。通过都有对应的数据成员或对应位。通过Direct3D中的函数初始化并填充一个中的函数初始化并填充一个D3DCAPS9结构对结构对象可以获得一个特定硬件的性能参数。象可以获得一个特定硬件的性能参数。n通过检查填充后的通过检查填充后的D3DCAPS9对象中的相关数对象中的相关数据,就可以知道硬件设备是否支持据,就可以知道硬件设备是否支持Direct3D的的某个特性。某个特性。192.4 初始化Direct3DnDirect3D的初始化可以分为以下的几个步骤。的初始化可以分为以下的几个步骤。(1)获得一个IDirect3D9接口指针,该接口用于获得系统图形硬件信息并进而创建IDirect3DDevice9接口。IDirect3DDevice9接口代表了进行图形渲染的硬件设备。(2)确认设备的性能(D3DCAPS9),查看显示设备是否支持硬件顶点处理,根据显示设备的性能创建出合适IDirect3DDevice9接口。(3)初始化一个D3DPRESENT_PARAMETERS结构对象,该结构包含了一系列用来指定IDirect3DDevice9接口特性的数据成员。(4)根据D3DPRESENT_PARAMETERS对象来创建一个IDirect3DDevice9接口。202.4.1 获得IDirect3D9接口n初始化初始化Direct3D首先要得到一个首先要得到一个IDirect3D9接口。接口。nDirect3D提供了获得提供了获得IDirect3D9接口的专用函数:接口的专用函数:IDirect3D9*_d3d9;_d3d9=Direct3DCreate9(D3D_SDK_VERSION);nIDirect3D9接口有两个用途:设备枚举以及创建接口有两个用途:设备枚举以及创建IDirect3DDevice9接口。接口。212.4.2 确认硬件顶点处理能力n在确认硬件顶点处理能力的过程中,通过以下程序获在确认硬件顶点处理能力的过程中,通过以下程序获得主显示设备的性能并填充得主显示设备的性能并填充D3DCAPS9对象:对象:HRESULT IDirect3D9:GetDeviceCaps(UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9*pCaps);n接着可以确认主显示设备的性能,以下为处理代码:接着可以确认主显示设备的性能,以下为处理代码:参见教材P46222.4.3 填充D3DPRESENT_PARAMETERS结构n下一步需要填充一个下一步需要填充一个D3DPRESENT_PARAMETERS结构。该结构是用来结构。该结构是用来描述需要创建的描述需要创建的IDirect3DDevice9接口的信息,该结构的定义为:接口的信息,该结构的定义为:typedef struct _D3DPRESENT_PARAMETERS_ UINT BackBufferWidth;UINT BackBufferHeight;D3DFORMAT BackBufferFormat;UINT BackBufferCount;D3DMULTISAMPLE_TYPE MultiSampleType;DWORD MultiSampleQuality;D3DSWAPEFFECT SwapEffect;HWND hDeviceWindow;BOOL Windowed;BOOL EnableAutoDepthStencil;D3DFORMAT AutoDepthStencilFormat;DWORD Flags;UINT FullScreen_RefreshRateInHz;UINT PresentationInterval;D3DPRESENT_PARAMETERS;232.4.3 填充D3DPRESENT_PARAMETERS结构n下面是下面是D3DPRESENT_PARAMETERS对象的填充实例:对象的填充实例:D3DPRESENT_PARAMETERS d3dpp;d3dpp.BackBufferWidth=800;d3dpp.BackBufferHeight=600;d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8;/像素格式d3dpp.BackBufferCount=1;d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;d3dpp.MultiSampleQuality=0;d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;d3dpp.hDeviceWindow=hwnd;/窗口句柄d3dpp.Windowed=false;/全屏d3dpp.EnableAutoDepthStencil=true;d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;/深度缓冲区格式d3dpp.Flags=0;d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;242.4.4 创建一个IDirect3DDevice9接口n填写完填写完D3DPRESENT_PARAMETERS结构后,结构后,即可开始创建即可开始创建IDirect3DDevice9接口:接口:HRESULT IDirect3D9:CreateDevice(UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS*pPresentationParameters,IDirect3DDevice9*ppReturnedDeviceInterface);252.4.4 创建一个IDirect3DDevice9接口nIDirect3DDevice9接口的创建代码如下:接口的创建代码如下:IDirect3DDevice9*device=0;hr=d3d9-CreateDevice(D3DADAPTER_DEFAULT,/主硬件适配器 D3DDEVTYPE_HAL,/设备类型 hwnd,/和设备关联的窗口 D3DCREATE_HARDWARE_VERTEXPROCESSING,/硬件顶点处理类型&d3dpp,/描述参数&device);/返回的设备if(FAILED(hr):MessageBox(0,CreateDevice()-FAILED,0,0);return 0;262.5 示例:初始化Direct3Dn在本节的例子中,将初始化一个在本节的例子中,将初始化一个Direct3D程序,程序,并且使窗口当前显示的颜色为黑色并且使窗口当前显示的颜色为黑色(示例效果见示例效果见图图2.7)。n本例和该书中其他的所有示例都使用了本例和该书中其他的所有示例都使用了d3dUtility.h和和d3dUtility.cpp文件中的代码。文件中的代码。272.5.1 d3dUtility.h/cpp文件n首先来观察首先来观察d3dUtility.h文件:文件:参见教材P50nEnterMsgLoop函数里封装了程序的主消息循环。该函数里封装了程序的主消息循环。该函数需要获得一个指向渲染函数的函数指针。因为主函数需要获得一个指向渲染函数的函数指针。因为主消息循环需要调用渲染函数来渲染场景。此函数的具消息循环需要调用渲染函数来渲染场景。此函数的具体定义如下:体定义如下:参见教材P51ncurrTime、timeDelta等关于时间的部分代码主要用等关于时间的部分代码主要用于计算两次调用渲染函数间的间隔时间,也就是帧和于计算两次调用渲染函数间的间隔时间,也就是帧和帧之间的时间间隔。帧之间的时间间隔。Release为模板函数,主要用于使用相同的方法轻松地释放一个COM接口。Delete为模板函数,能够安全删除指针并释放内存。WndProc用于主程序窗口的窗口消息处理循环。282.5.2 程序框架n这这3个函数并不包括消息处理函数或者个函数并不包括消息处理函数或者WinMain 函数。函数。这这3个函数在不同的例子中具有不同的实现,但是完个函数在不同的例子中具有不同的实现,但是完成的功能却基本相同。对这些函数说明如下:成的功能却基本相同。对这些函数说明如下:bool Setup()该函数用来完成例子所需的所有设置,例如完成资源分配、设备性能检测以及程序状态设置等工作。void Cleanup()该函数用于释放Setup函数中所分配的资源,例如释放在堆上占用的内存空间。bool Display(float timeDelta)该函数包含了所有的渲染代码以及那些在每帧之间控制程序的操作代码。292.5.3 D3D初始化示例n这个例子将创建和初始化一个这个例子将创建和初始化一个Direct3D应用程序,然应用程序,然后把屏幕渲染成黑色。后把屏幕渲染成黑色。n程序将从引用程序将从引用“d3dUtility.h”头文件和声明一个用头文件和声明一个用于描述设备的全局变量开始:于描述设备的全局变量开始:#include d3dUtility.hIDirect3DDevice9*Device=0;n然后通过程序的主框架实现整个程序:然后通过程序的主框架实现整个程序:bool Setup()return true;void Cleanup()302.5.3 D3D初始化示例nDisplay函数调用了函数调用了IDirect3DDevice9:Clear方法,方法,该函数可以分别把后缓冲区清除为黑色,并将深度缓该函数可以分别把后缓冲区清除为黑色,并将深度缓冲区清除为冲区清除为1.0以及模板缓冲区清除为以及模板缓冲区清除为0:参见教材P53nIDirect3DDevice9:Clear方法的声明如下:方法的声明如下:参见教材P53n窗口消息处理函数主要处理两个事件,从而允许程序窗口消息处理函数主要处理两个事件,从而允许程序在按在按Esc键后退出程序:键后退出程序:参见教材P54n最后,最后,WinMain执行了下列操作。执行了下列操作。(1)初始化主显示窗口和Direct3D。(2)调用Setup函数来设置程序资源。(3)进入消息循环后使用Display函数进行图形渲染。(4)清理程序,最后释放IDirect3DDevice9接口。312.6 小 结n程序员调用程序员调用Direct3D的函数,的函数,Direct3D通过设通过设备硬件抽象层的接口直接控制硬件执行相应的备硬件抽象层的接口直接控制硬件执行相应的操作。操作。nREF设备设备(参考光栅化设备参考光栅化设备)允许开发者去实验允许开发者去实验Direct3D提供了但是硬件不支持的性能。提供了但是硬件不支持的性能。nCOM技术的运用使技术的运用使DirectX具有语言无关性以具有语言无关性以及向后兼容性。及向后兼容性。n表面是一些特殊的表面是一些特殊的Direct3D接口,用来保存接口,用来保存2D图像。图像。322.6 小 结nIDirect3D9接口用于查询系统所安装的显示设接口用于查询系统所安装的显示设备的信息,通过这个接口,我们能获取设备的备的信息,通过这个接口,我们能获取设备的性能。它还用于创建性能。它还用于创建IDirect3DDevice9接口。接口。n可以认为可以认为IDirect3DDevice9接口是用于控制图接口是用于控制图形设备的软件接口。形设备的软件接口。n示例框架用于提供一组能用于本书中所有示例示例框架用于提供一组能用于本书中所有示例的接口。的接口。d3dUtility.h/cpp中提供了一些工具代中提供了一些工具代码,封装了每个程序都必须实现的初始化过程。码,封装了每个程序都必须实现的初始化过程。33
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!