一、D3D簡述
由微軟公司開發的DirectX,並不是一個單純的圖形API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多個組件,它提供了一整套的多媒體接口方案。
D3D即Direct3D是DirectX的三維部分,集成了開發DirectX程序三維圖形部分的所有API程序,同時它支持與CUDA的互操作,這樣經CUDA並行計算後圖像數據可以直接供D3D做顯示,這非常適合圖形圖像系統的研發。
二、D3D程序基本結構
一個D3D程序除去Windows窗口生成和消息傳遞,主要包含3個步驟:
初始化D3D設備資源--->圖形顯示設置---->D3D資源設備釋放。
1、初始化D3D設備資源
建一個D3D接口:
LPDIRECT3D9 g_pD3D = NULL;
g_pD3D =Direct3DCreate9(D3D_SDK_VERSION);
LPDIRECT3D9的對象是D3D程序的最頂層對象,其它對象都必須通過它的接口函數調用得到。
Direct3DCreate9(D3D_SDK_VERSION)函數就是創建一個當前版本的一個D3D對象並返回接口。
創建D3D設備對象:
D3DPRESENT_PARAMETERS d3dpp; //顯示參數
d3dpp.BackBufferWidth = 800; //顯示像素x
d3dpp.BackBufferHeight = 600; //顯示像素y
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; //32位像素格式
d3dpp.BackBufferCount = 1; //備緩衝表面的數量,通常設爲“1”
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; //全屏抗鋸齒的類型
d3dpp.MultiSampleQuality = 0; //全屏抗鋸齒的質量等級
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //指定表面在交換鏈中是如何被交換的
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = false; //true表示窗口顯示,false爲全屏顯示
d3dpp.EnableAutoDepthStencil = true; //設爲true,D3D將自動創建深度/模版緩衝
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; // 深度/模版緩衝的格式
d3dpp.Flags = 0; //附加特性,可以設爲D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL
//深度/模版緩衝在調用IDirect3DDevice9::present方法後將被刪除,這有利於提程序性能提升
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; //刷新率,設定D3DPRESENT_RATE_DEFAULT使用默認 刷新率
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //PresentationInterval——屬於D3DPRESENT成員,又有兩個 常用標誌,其餘請查SDK:
D3DPRESENT_INTERVAL_IMMEDIATE——立即交換
D3DPRESENT_INTERVAL_DEFAULT——D3D選擇交換速度,通常等於刷新率
IDirect3DDevice9* device = 0; //d3d設備
hr = g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT, // 指定對象要表示的物理顯示設備
D3DDEVTYPE_HAL, // 定設備類型 硬件設備D3DDEVTYPE_HAL,
軟件設備D3DDEVTYPE_REF
hwnd, // window associated with device
D3DCREATE_HARDWARE_VERTEXPROCESSING, // 頂點處理類型,硬件處理方式。軟件處理方式爲
D3DCREATE_SOFTWARE_VERTEXPROCESSING
&d3dpp, // 顯示參數
&device);
if( FAILED(hr) )
{
::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
return 0;
}
2、圖形顯示
HRESULT IDirect3DDevice9::Clear()函數的作用是在繪製函數前,重置viewport的緩衝區,這是在繪製3D圖形前必須調用的
BeginScene()和EndScene()分別爲開始和結束渲染,兩者必須成對出現,並且不允許嵌套和交錯。注意圖形渲染的結果是存儲在後臺緩衝區的。
HRESULT IDirect3DDevice9:: Present()函數是將圖形渲染的結果由後臺緩衝區複製到前臺緩衝區予以顯示。
device->Clear(0, 0,
D3DCLEAR_TARGET ,
D3DCOLOR_XRGB(125,0,255), 1.0f,0);
device->BeginScene();
// ........ //添加紋理渲染,圖元繪製等函數
device->EndScene();
//將渲染的結果存儲到後臺緩衝區
//0表示更新所有的緩衝區
device->Present(0, 0, 0, 0);
3、D3D設備資源釋放
釋放D3D設備資源的方法如下:
if( device ) device->Release();
if(g_pD3D) g_pD3D->Release();
Release()函數會將調用這個設備的DirectX對象的引用計數減1,當DirectX對象的引用計數爲0時,它就會釋放它所佔有的資源。