Direct3D的初始化分为四步
- 创建Direct3D接口对象(注意区别Direct3D设备接口)
- 获取设备的硬件信息
- 填充D3DPRESENT_PARAMETERS结构体
- 创建Direct3D设备接口
1.创建Direct3D接口对象
LPDIRECT3D pD3D=NULL;
if(NULL==(pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
2.获取设备的硬件信息
这一步操作可以得到系统中可用的显卡的性能,显示模式,格式以及其他相关信息。这些信息保存在一个叫做D3DCAPS9的结构体中。
我们主要关心的是显卡支不支持硬件顶点运算(硬件加速功能,其速度远远高于软件顶点运算),因为这种方式较为高效。
第一个参数表示显卡的序号,一般为默认显卡。
第二个参数表示设备类型。
第三个参数表示指向该包含设备信息结构体的指针。
关于获取设备信息,代码如下
D3DCAPS9 caps;
int vp=0;
if(FAILED(p3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVITYPE_HAL,&caps)))
{
return E_FAIL;
}
if(caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLTGHT)
//D3DDEVCAPS_HWTRANSFORMANDLTGHT表示显卡支持变换和光照
vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;//支持硬件顶点运算,那么采用硬件顶点运算
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;//不支持的话采用软件顶点运算。
3.填内容。(这一步其实就是做填空题,为我们后面创建硬件接口做准备)
D3DPRESENT_PARAMETERS结构体,也就是设置程序以及程序的一些基于硬件的基本信息(缓冲区,窗体模式等等)。
创建交换链
Direct3D动画显示和电影一样,通过每秒多帧的技术实现流畅的动画显示。而用到的技术就是交换链,交换链可以使动画平滑的过渡。交换链中存在两个或两个以上的平面组成,每个平面存储着2D图形的一个线性数组,数组中的每个元素都表示平面上的一个像素。(对于三维物体,还有一个关于深度信息,而这个深度信息一般保存在深度缓冲区上,对于每一个像素都对应着一个深度信息,深度信息是与他们的平面像素信息分开存储的)。
对于要在平面上显示的东西存储在缓冲区中,缓冲区又有前台和后台之分。而前台缓冲区和后台缓冲区是系统中的内存或者显存的内存块。前台缓冲区存储已经显示在屏幕上的信息,而后台存储区存储即将要显示的信息。通过前后缓冲区的配合,运用交换链的技术,就可以流畅的显示动画了。
D3DPRESENT_PARAMETERS d3dPP;
d3dPP.BackBufferCount=2;
注意在第三步中只是声明了要创建的缓冲区或者其他设备的信息,并没有真正的创建,在第四步设备接口创建时交换链才真正的在内存中被创建。
交换链在创建之后,需要我们去“驱动“其进行翻转操作,将前后缓冲区的信息进行翻转。这一步在Direct3D渲染的过程中进行驱动。
会调用到IDirect3DDevice9::Present()函数,进行页面的翻转和显示。(翻转主要是将内存中的指针进行调换)
4.创建设备接口
这一步其实就是利用第一步创建的Direct3D接口对象来调用IDirect3D::CreateDevice方法
if(FAILED(pD3D->CreateDevice(D3DADAPTE_DEFAULT,D3DDEVTYPE_HAL,hwnd,VP&d#dpp,&g_pd3dDevice)))
return E_FAIL;