D3D初始化三带你一起看代码

时间:2022-10-03 19:45:25

        今天晚上我们一起坐下喝口茶,用代码对侃D3D初始化。

        前面由于是理论,其实也不算是太专业的理论,我已经说的够白的啦!文字归文字,咱还是代码形象化说明下吧! 基于VC系列开发平台,说明: 最基础的东西就不说了,你比如说Windows窗口那一套,编译环境这块,着重说下,D3D相关的初始化。

 

       (1)需要用到的头文件 #include "d3d9.h" #include "d3d9x.h" //d3d9.h对应的是d3d9.lib;d3d9x.h对应的是d3d9x.lib

 

       (2)需要用到的变量 IDirect3D9 *g_pD3D; //D3D对象 IDirect3Device9 *g_pDevice; //D3D设备

 

       (3)如何初始化COM呢? Windows提供了一个函数 CoInitialize(),参数为NULL。

 

       (4)有人会问这个函数有什么作用啊? 别急,我这就说呵呵: 它主要告诉Windows以什么方式创建 COM,CoInitialize告诉它以单线程创建COM,而且效率要比CoInitializeEx(告诉Wind ows以多线程创建COM)高老多。其他COM的用途,我现在还不清楚,以后如果还有更全面的认识,会更新补充的。

 

       (5)进入D3D初始化最重要的模块,D3D的初始化函数:

 

           A、创建D3D接口 if(NULL = (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))) { return E_FAIL; }

 

           B、取得当前的显示模式 D3DDISPLAYMODE d3dmm; if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3dmm))) { return E_FAIL; }//这里主要是为了为设置显示模式所下的伏笔

 

          C、取得客户区矩形的大小 RECT rect; GetClientRect(&rect);

 

          D、设置显示模式 D3DPRESENT_PARAMETERS d3dpresent; 下面分析一下该结构体的参数:  

                     UINT BackBufferWidth, BackBufferHeight;//指定的是屏幕缓冲区的宽度、高度

                     D3DFORMAT BackBufferFormat; //后备缓冲区的格式

                     UINT BackBufferCount; //后备缓冲区的数目

                     D3DMULTISAMPLE_TYPE MultiSampleType; //多重采样

                     DWORD MultiSampleQuality; //以上这两个参数可以使你的场景渲染的更加美好,但是有一点 缺陷就是需要额外的系统内存。

                     D3DSWAPEFFECT SwapEffect; //交换缓冲支持的效果类型

                     HWND hDeviceWindow; //当前作用的设备窗口句柄

                      BOOL Windowed; //指定渲染大小方式:TRUE,窗口模式渲染;FALSE,全屏窗口渲染。

                     BOOL EnableAutoDepthStencil; //是否支持深度

                     D3DFORMAT AutoDepthStencilFormat; //该参数是在上一参数指定为TRUE的时候,才有意义,指定 深度格式 还有三个参数,一般不会用到,所以需要看的请查看DirectXAPI。

 

             E、创建D3D设备

 

                      if(FAILD(g_pD3D->CreateDevice

                                                   ( D3DADAPTER_DEFAULT,// 使用当前显卡

                                                      D3DDEVTYPE_HAL,// 设备类型

                                                       hWnd,// 该程序所在的窗口句柄 D3DCREATE_SOFTWARE_VERTEXPROCESSING,// 用软件的方法处理顶点数据

                                                       &d3dpresent,// 指向上面的结构

                                                       &g_pDevice // 指向3D设备的指针 )))

                                                      {

                                                          return E_FAIL;

                                                     }

 

          (6)释放:

                           SAFE_RELEASE( g_pD3D );

                           SAFE_RELEASE( g_pDevice );

                           CoUninitialize();

                          一定要记得释放哈!

 

       哇塞D3D的初始化终于完了,记住了没大家伙,一些结构或者参数不需要记忆,知道就行,记得查DirectXAPI。