Direct3D 程序结构
与普通的win32 窗口程序不同的地方:在初始化时需要对Direct3D进行初始化,并且在程序中具有推行绘制过程。
第一步: 创建 IDirect3D9接口对象,用于获取本机显示硬件设备的信息,以及创建用于绘制3D图形的 IDirect3DDevice9 接口对象
LPDIRECT3D9 pD3D=NULL;
pD3D=Direct3DCreate9(D3D_SDK_VERSION);
第二步: 获取硬件设备信息
获取硬件设备信息包括取得系统中所有可用的图形卡的性能、显示模式、格式及其他相关信息。例如:通常用来检测图形卡(或显卡)是否支持硬件顶点运算
Direct3D可以有两种不同的顶点运算方式,即 软件顶点运算和硬件顶点运算。其中,硬件顶点运算需要有显卡的支持,这种凡事将使用硬件专有的加速功能,其执行速度将远远快于软件顶点运算方式。
第三步:创建Direct3D设备接口
在创建 IDirect3DDevice9 接口对象之前,需要准备一个 D3DPRESENT_PARAMETERS
结构类型的参数,用于说明如何创建Direct3D 设备
BackBufferWidth BackBufferHeight BackBufferCount 字段指定后台缓冲区的宽度、高度和数量。后台缓冲区是临时保存绘制内存的一片内存块,在通常情况下,其大小与窗口客户区的大小相同。
BackBufferFormat 字段指定了后台缓冲区保存像素的格式,它可以用D3DFORMAT 枚举定义
MultiSampleType 和 MultiSampleQuality 成员指定了 多重采样的类型及格式,通常设为
D3DMULTISAMPLE_NONE 和0
SwapEffect 成员指定 Direct3D 如何将后台缓冲区的内容复制到前台的缓存中,通常设为D3DSWAPEFFECT_DISCARD ,表示当后台缓冲区赋值到前台时清楚后台缓冲区内容
hDeviceWindow 成员用于指定绘制图形的窗口句柄,为NULL时表示使用当前被激活的窗口。绘制窗体的显示模式由 Windowed 成员指定,为TRUE时表示使用窗口模式,为FASLE表示使用全屏模式
EnableAutoDepthStencil 表示 Direct3D 是否为应用程序自动管理深度缓存,若为TRUE,那么需要AutoDepthStencilFormat 成员指定深度缓冲的像素格式
FullScreen_RefreshRateInHz 表示当全屏模式时指定屏幕的刷新模式,在全屏模式下可以设为默认模式D3DPRESENT_RATE_DEFAULT, 在窗口模式下,要设为0
Flags 用于表示附加属性,通常可以设为 0: 而 PresentationInterval 成员用于指定平面的翻转模式,在窗口模式下 其值为0
设置好 D3DPRESENT_PARAMETERS 结构后,调用IDirect3D9接口的 CreateDeivce 方法创建IDirect3DDevice9 接口对象
Adapter 表示将创建的IDirect3DDevice9 接口对象所代表的显卡类型,可以为D3DDEVTYPE_HAL D3DDEVTYPE_REF D3DDEVTYPE_SW
BehaviorFlags 指定了 Direct3D 设备进行3D 运算的方式,通常为 D3DCREATE_HARDWARE_VERTEXPROCESSING或者 D3DCREATE_SOFTWARE_VERTEXPROCESSING 分别表示进行硬件顶点运算或 软件顶点运算
上面这些都是为绘图做的准备工作,创建 IDirect3D9 接口对象,然后围绕着接口对象 先获取设备信息判断是否支持硬件顶点运算,然后创建 IDirect3DDevice9 接口对象。
在这些准备工作做好之后,开始 Direct3D 图形绘制
计算机绘图的工作方式与电影放映其实十分类似,影片图像以帧为单位,以每秒24帧的速度连续播放,由于这些图像之间的差别十分小,以及人眼滞留作用,所有我们可以看到连续的动画。同理,计算机绘图,是通过每秒渲染 30 或更多的图像,产生动画的效果。Direct3D 使用了一种称为 交换链(Page Flipping)的技术让画面平滑的过渡。
对于 3D 图形,还需要一个深度信息,Direct3D 使用深度缓存为最终绘制的图像的每个像素存储一个深度信息。深度缓存只包含了特定像素的深度信息而不含图像数据的表面信息。
前台缓存和后台缓存是位于系统内存或显卡里的内存块,对应于将要显示的二维显示区域。前台缓冲区主要用于刷新屏幕,是用户可见的部分,后台缓冲区则主要用于图形的绘制,堆用户是不可见的。绘制完成后,两者进行交换链的页翻动的工作,把处理完的图形显示出来。
Direct3D 的绘制过程就是 : 绘制 ->显示 ->绘制 -> 显示。
每当开始绘制图形之前,都需要通过 IDirect3DDevice9 接口的 Clear 方法将后台缓存中的内容进行清空,并设置表面的填充颜色
pRects 用于指定堆表面指定的矩形区域进行清除操作,数组中包含的矩形的数量由Count 参数指定
Flags 指定需要清除的表面,该参数可以取值于 D3DCLEAR_TARGET 、D3DCLEAR_ZBUFFER 和D3DCLEAR_STENCIL, 分别表示对后台缓存、深度缓存和模板缓存进行清除
Color 参数用于指定在清除缓存内容后设置的背景色,可以通过 D3DCOLOR_XRGB 宏将 RGB值转换给该参数
Z参数用于指定当清除缓存内容后设置深度缓存的值,通常设为1.0f 而 Stencil参数则表示设置模板缓存的值,通常设为0
图形的实际绘制工作是在调用 IDirect3DDevice9 接口的 BeginScene 和 EndScene 方法之间进行的。调用 BeginScene 方法通知 Direct3D 设备开始进行图形渲染工作,而 EndScene 方法则通知Direct3D 设备结束图形渲染工作
g_pd3dDevice->BeginScene(); // 开始绘制
/* 图形的实际绘制过程*/
g_pd3dDevice->EndScene(); // 结束绘制
绘制图形结束后,此时所有已绘制的内容将保存在后台缓存里,为了能够在屏幕上显示这些内容,就需要通知 Direct3D将后台缓存中的内容复制到前台缓存中。 IDirect3DDevice9 接口的 Present 方法 用于前台缓存与后台缓存之间的翻转
最后的收尾工作-------结束并清理对象资源
由于COM 接口对象是通过控制对它的引用计数器来决定声明周期的,所以当对某个COM 接口对象引用结束后,应用程序必须调用 Release 方法释放接口,而此时该对象的引用计数器减1 。如果最终引用计数器为0 ,那么该对象占用的内存将被释放