收藏 分销(赏)

第2章DirectX编程.ppt

上传人:xrp****65 文档编号:13087231 上传时间:2026-01-14 格式:PPT 页数:33 大小:829KB 下载积分:10 金币
下载 相关 举报
第2章DirectX编程.ppt_第1页
第1页 / 共33页
第2章DirectX编程.ppt_第2页
第2页 / 共33页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级二级二级二级二级二级二级二级二级二级二级,第三级,第四级,第五级,*,第,2,章,Direct3D,初始化,主要目标:,了解,Direct3D,与硬件图形设备之间的关系。,了解,Direct3D,中组件对象模型,(COM),所扮演的角色。,学习基本的图形学概念,例如二维图片的存储、页面翻转及深度缓冲等概念。,初始化,Direct3D,。,熟悉本书示例中所使用的程序结构。,2,2.1 Direct3D,体系结构,Direct3D,是一个图形应用程序的底层接口,(API),,通过该接口可以直接使用硬件的,3D,加速性能来渲染三维场景,可以认为,Direct3D,是应用程序和硬件设备之间的一个中间媒介。,图,2.1,展示了应用程序、,Direct3D,和硬件设备之间的层次关系。,Direct3D,不能直接和硬件设备打交道的原因是微型计算机拥有各种各样的显卡,每种显卡的能力都不一样,而且它们对相同功能的实现方式也不一样。,图,2.1,3,2.1.1 REF,设备,如果使用在,Direct3D,中提供了、但是硬件不支持的特性。,Direct3D,提供参考光栅处理功能,(REF),,它使用软件模拟的方法来实现整个,Direct3D,中的,API,。,如果你的显卡不支持,就可以用,REF,设备来实现。只有程序开发者才有必要去深入地了解,REF,设备,当程序和,DirectX SDK,一起出售时没有必要告诉最终用户需不需要使用,REF,设备。由于,REF,通过软件模拟硬件功能,所以速度很慢,在实际的应用中很少用到。,4,2.1.2 D3D,设备类型,D3DDEVTYPE,D3DDEVTYPE_HAL,由硬件实现功能,D3DEVTYPE_REF,由软件模拟实现功能,D3DDEVTYPE,为枚举类型,硬件初始化后其值为:,5,2.2,组件对象模型,组件对象模型,(Component Object Model,,,COM),使,DirectX,具有了,语言无关性,和,向后兼容性,。,当使用,C+,编写,DirectX,的应用程序的时候,许多,COM,组件方法和属性都可以直接调用。在,COM,技术中可以通过特殊的函数或者,COM,组件的某个接口来得到另外一个,COM,组件的接口。,另外,当完成某个接口的操作而需要释放它们的时候,需要用,Release,方法而不是用,delete,操作来完成释放,(,所有的,COM,组件都从一个,IUknown,接口继承,而在,IUknown,接口中已经提供了,Release,方法,),。,6,2.3,预 备 知 识,要了解,Direct3D,的初始化过程,需要熟悉基本的图形学概念和相关的,Direct3D,数据类型。,相关概念和数据类型,,Direct3D,的初始化。,7,2.3.1,表面缓冲区,(Surface),表面缓冲区,(Surface),是像素的矩阵,,Direct3D,主要使用表面缓冲区来存储二维图像的数据。,在图,2.2,中,给出了表面缓冲区相关数据的定义。,Pitch,存储区是一个比表面缓冲区大的存储区域,表面缓冲区是,Pitch,存储区的一部分。,表面缓冲区的宽度和高度以像素为单位,Pitch,存储区以字节为单位,图,2.2,8,2.3.1,表面缓冲区,(Surface),在,Direct3D,中,用,IDirect3DSurface9,接口来表示表面缓冲区。该接口提供了直接对表面缓冲区进行读写的方法,其中主要的几个方法为:,LockRect,通过调用这个方法,可以锁定表面缓冲区并得到一个指向表面缓冲区的指针。在获得表面缓冲区指针后,可以通过指针偏移来读写需要的像素数据。,UnlockRect,通过,LockRect,锁定表面缓冲区后,通过该方法解除对表面缓冲区内存区域的锁定。,GetDesc,填充一个用来描述表面缓冲区数据信息的,D3DSURFACE_DESC,结构,从而获得表面缓冲区的信息。,9,2.3.2,重采样,重采样技术是指通过像素矩阵来描述图像时使图像更加平滑的技术。重采样技术常常用于屏幕抗锯齿操作。采用重采样技术和不采用重采样技术描述图像时的差别。,图,2.3,采用重采样,不采用重采样,10,2.3.2,重采样,D3DMULTISAMPLE_TYPE,包含用来指定重采样级别的枚举值,其主要枚举值包括:,D3DMULTISAMPLE_NONE,不进行重采样。,D3DMULTISAMPLE_1_SAMPLE D3DMULTISAMPLE_16_SAMPLE,指定,16,个不同的重采样级别,每个级别都对应了不同的效果。,本书中的程序基本上都没有用重采样技术,因为,采用重采样技术后将降低程序的执行速度,。如果需要启动重采样技术,要首先调用,IDirect3D9:CheckDeviceMultiSampleType,方法检测显卡是否支持重采样技术,然后设定重采样技术的级别。,11,2.3.3,像素格式,常用的,D3DFORMAT,类型的部分枚举值:,D3DFMT_R8G8B8,指定像素采用,24,位数据格式进行描述。,D3DFMT_X8R8G8B8,指定像素使用该,32,位像素格式。,D3DFMT_A8R8G8B8,指定像素采用该,32,位像素格式。,D3DFMT_A16R16G16B16,指定像素使用该,64,像素格式。,12,2.3.4,存储池,表面缓冲区和其他,Direct3D,资源都可以被放在各式的存储池中,通过,D3DPOOL,类型的枚举值可以指定不同的存储池,目前可以用的存储池主要有:,D3DPOOL_DEFAULT,默认存储池,D3DPOOL_MANAGED,托管存储池,D3DPOOL_SYSTEMMEM,系统存储池,D3DPOOL_SCRATCH,SCRATCH,存储池,13,2.3.5,交换链和页面翻转,Direct3D,维护着一组表面缓冲区,通常有两个或者三个,通常将这组表面缓冲区的组合叫作,交换链,,通过,IDirect3DSwapChain9,可以对交换链进行管理。,交换链,更准确的说法是,页面翻转技术,,主要用途是在播放动画的时候使帧和帧间的交换变得更加流畅。图,2.4,中展示了具有两个表面缓冲区的交换链。,14,2.3.5,交换链和页面翻转,图,2.5,表现了在,Presenting,操作前后的交换链。,渲染图形的代码结构变为:,(1),将显示数据渲染到后缓冲区。,(2),进行,Presenting,操作,交换前后缓冲区。,(3)Goto(1),15,2.3.6,深度缓冲区,深度缓冲区也是一个表面缓冲区,但是在深度缓冲区中不是保存图片信息,而是,保存着每个像素点对应的深度信息,。,图,2.6,展示了一个简单的场景,在这里部分物体遮挡了在其后的物体。,Direct3D,中使用深度缓冲,(,也称为,Z,缓冲,),技术来进行,可见面的判断,。,16,2.3.6,深度缓冲区,深度缓冲区的大小格式决定了深度测试的准确性。比如,,24,位的深度缓冲区比,16,位的准确性高。,通常在,24,位的深度缓冲格式下,程序就可以运行得很好,但,Direct3D,还是提供了,32,位的深度缓存区:,D3DFMT_D32,指定一个,32,位的深度缓存区。,D3DFMT_D24S8,指定一个,24,位的深度缓存区,其中,8,位预定为模板缓存。,D3DFMT_D24X8,指定一个,24,位的深度缓存区。,D3DFMT_D24X4S4,指定一个,24,位的深度缓存区,,4,位作为模板缓存。,D3DFMT_D16,指定一个,16,位的深度缓冲区。,17,2.3.7,顶点处理,顶点是组成,3D,空间的基本元素,在,Direct3D,中对顶点的处理有两种方法,即,软件处理方法,和,硬件处理方法,。,软件顶点处理在任何配置下都是被支持的,并且也都可用;但是硬件顶点处理只有在显卡支持硬件顶点处理的情况下才可以使用。,18,2.3.8,设备性能,Direct3D,提供的所有特性在,D3DCAPS9,结构中都有对应的数据成员或对应位。通过,Direct3D,中的函数初始化并填充一个,D3DCAPS9,结构对象可以获得一个特定硬件的性能参数。,通过检查填充后的,D3DCAPS9,对象中的相关数据,就可以知道硬件设备是否支持,Direct3D,的某个特性。,19,2.4,初始化,Direct3D,Direct3D,的初始化可以分为以下的几个步骤。,(1),获得一个,IDirect3D9,接口指针,该接口用于获得系统图形硬件信息并进而创建,IDirect3DDevice9,接口。,IDirect3DDevice9,接口代表了进行图形渲染的硬件设备。,(2),确认设备的性能,(D3DCAPS9),,查看显示设备是否支持硬件顶点处理,根据显示设备的性能创建出合适,IDirect3DDevice9,接口。,(3),初始化一个,D3DPRESENT_PARAMETERS,结构对象,该结构包含了一系列用来指定,IDirect3DDevice9,接口特性的数据成员。,(4),根据,D3DPRESENT_PARAMETERS,对象来创建一个,IDirect3DDevice9,接口。,20,2.4.1,获得,IDirect3D9,接口,初始化,Direct3D,首先要得到一个,IDirect3D9,接口。,Direct3D,提供了获得,IDirect3D9,接口的专用函数:,IDirect3D9*_d3d9;,_d3d9=Direct3DCreate9(D3D_SDK_VERSION);,IDirect3D9,接口有两个用途:设备枚举以及创建,IDirect3DDevice9,接口。,21,2.4.2,确认硬件顶点处理能力,在确认硬件顶点处理能力的过程中,通过以下程序获得主显示设备的性能并填充,D3DCAPS9,对象:,HRESULT IDirect3D9:GetDeviceCaps(,UINT Adapter,D3DDEVTYPE,DeviceType,D3DCAPS9*,pCaps,);,接着可以确认主显示设备的性能,以下为处理代码:,参见教材,P46,22,2.4.3,填充,D3DPRESENT_PARAMETERS,结构,下一步需要填充一个,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;,23,2.4.3,填充,D3DPRESENT_PARAMETERS,结构,下面是,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;,24,2.4.4,创建一个,IDirect3DDevice9,接口,填写完,D3DPRESENT_PARAMETERS,结构后,即可开始创建,IDirect3DDevice9,接口:,HRESULT IDirect3D9:CreateDevice(,UINT Adapter,D3DDEVTYPE,DeviceType,HWND,hFocusWindow,DWORD,BehaviorFlags,D3DPRESENT_PARAMETERS*,pPresentationParameters,IDirect3DDevice9*,ppReturnedDeviceInterface,);,25,2.4.4,创建一个,IDirect3DDevice9,接口,IDirect3DDevice9,接口的创建代码如下:,IDirect3DDevice9*device=0;,hr=d3d9-,CreateDevice,(,D3DADAPTER_DEFAULT,/,主硬件适配器,D3DDEVTYPE_HAL,/,设备类型,hwnd,/,和设备关联的窗口,D3DCREATE_HARDWARE_VERTEXPROCESSING,/,硬件顶点处理类型,&d3dpp,/,描述参数,/,返回的设备,if(FAILED(hr,),:,MessageBox(0,CreateDevice,()-FAILED,0,0);,return,0;,26,2.5,示例:初始化,Direct3D,在本节的例子中,将初始化一个,Direct3D,程序,并且使窗口当前显示的颜色为黑色,(,示例效果见图,2.7),。,本例和该书中其他的所有示例都使用了,d3dUtility.h,和,d3dUtility.cpp,文件中的代码。,27,2.5.1 d3dUtility.h/cpp,文件,首先来观察,d3dUtility.h,文件:,参见教材,P50,EnterMsgLoop,函数里封装了程序的主消息循环。该函数需要获得一个指向渲染函数的函数指针。因为主消息循环需要调用渲染函数来渲染场景。此函数的具体定义如下:,参见教材,P51,currTime,、,timeDelta,等关于时间的部分代码主要用于计算两次调用渲染函数间的间隔时间,也就是帧和帧之间的时间间隔。,Release,为模板函数,主要用于使用相同的方法轻松地释放一个,COM,接口。,Delete,为模板函数,能够安全删除指针并释放内存。,WndProc,用于主程序窗口的窗口消息处理循环。,28,2.5.2,程序框架,这,3,个函数并不包括消息处理函数或者,WinMain,函数。这,3,个函数在不同的例子中具有不同的实现,但是完成的功能却基本相同。对这些函数说明如下:,bool,Setup(),该函数用来完成例子所需的所有设置,例如完成资源分配、设备性能检测以及程序状态设置等工作。,void Cleanup(),该函数用于释放,Setup,函数中所分配的资源,例如释放在堆上占用的内存空间。,bool,Display(float,timeDelta,),该函数包含了所有的渲染代码以及那些在每帧之间控制程序的操作代码。,29,2.5.3 D3D,初始化示例,这个例子将创建和初始化一个,Direct3D,应用程序,然后把屏幕渲染成黑色。,程序将从引用“,d3dUtility.h”,头文件和声明一个用于描述设备的全局变量开始:,#include d3dUtility.h,IDirect3DDevice9*Device=0;,然后通过程序的主框架实现整个程序:,bool,Setup(),return true;,void Cleanup(),30,2.5.3 D3D,初始化示例,Display,函数调用了,IDirect3DDevice9:Clear,方法,该函数可以分别把后缓冲区清除为黑色,并将深度缓冲区清除为,1.0,以及模板缓冲区清除为,0,:,参见教材,P53,IDirect3DDevice9:Clear,方法的声明如下:,参见教材,P53,窗口消息处理函数主要处理两个事件,从而允许程序在按,Esc,键后退出程序:,参见教材,P54,最后,,WinMain,执行了下列操作。,(1),初始化主显示窗口和,Direct3D,。,(2),调用,Setup,函数来设置程序资源。,(3),进入消息循环后使用,Display,函数进行图形渲染。,(4),清理程序,最后释放,IDirect3DDevice9,接口。,31,2.6,小 结,程序员调用,Direct3D,的函数,,Direct3D,通过设备硬件抽象层的接口直接控制硬件执行相应的操作。,REF,设备,(,参考光栅化设备,),允许开发者去实验,Direct3D,提供了但是硬件不支持的性能。,COM,技术的运用使,DirectX,具有语言无关性以及向后兼容性。,表面是一些特殊的,Direct3D,接口,用来保存,2D,图像。,32,2.6,小 结,IDirect3D9,接口用于查询系统所安装的显示设备的信息,通过这个接口,我们能获取设备的性能。它还用于创建,IDirect3DDevice9,接口。,可以认为,IDirect3DDevice9,接口是用于控制图形设备的软件接口。,示例框架用于提供一组能用于本书中所有示例的接口。,d3dUtility.h/cpp,中提供了一些工具代码,封装了每个程序都必须实现的初始化过程。,33,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服