您的位置:首页 > 其它

摸爬滚打DirectX11_day03——Direct3D的初始化

2016-12-11 11:12 183 查看
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: