今天晚上我们一起坐下喝口茶,用代码对侃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。