廢話不說,直接看代碼 :
LPDIRECT3D9EX g_pD3D = NULL;
LPDIRECT3DDEVICE9EX g_pD3DDvice = NULL;
//使用介面直接獲得 d3d對象,該對象是個總的調度介面。
if( FAILED(Direct3DCreate9Ex(D3D_SDK_VERSION, &g_pD3D)))
return ;
//從中得到顯示模式
D3DDISPLAYMODE d3ddm;
if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
{
return;
}
//檢測預設的適配器格式(當前的,可能具有多顯卡的情況),D3DDEVTYPE_HAL意味的要通過預設裝置的驅動進行訪問。
//hal層(硬體抽象)層,多由
//裝置供應商提供。D3DFMT_D16 :16位z-buffer位元深度。
//z-buffer為位面緩衝技術的一種,主要用於可見面得判定,它會紀錄每個位面象素的z序深度。
HRESULT hr = NULL;
if(FAILED(g_pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
d3ddm.Format, D3DUSAGE_DEPTHSTENCIL,
D3DRTYPE_SURFACE, D3DFMT_D16) ) )
{
if( hr == D3DERR_NOTAVAILABLE )
// POTENTIAL PROBLEM: We need at least a 16-bit z-buffer!
return;
}
//研究性代碼
CComPtr<IUnknown> pUnknown;
CComPtr<IDispatch> pDisp;
//這裡擷取pUnknown成功 證明是基於Iunknown介面繼承實現
g_pD3D->QueryInterface(__uuidof(IUnknown),(void **)&pUnknown);
//pDisp失敗,並無disp介面,也就是該對象僅為一個總的封包類,沒有連接點,及需分發給用戶端的訊息。
g_pD3D->QueryInterface(__uuidof(IDispatch),(void **)&pDisp);
//d3ddevice並非基於com的組件實現,這裡 g_pD3DDvice = NULL。
pUnknown->QueryInterface(__uuidof(IDirect3DDevice9Ex) ,(void **)&g_pD3DDvice);
//
//裝置的建立是個很複雜的工作,所以參數設定是必要的,直接關係建立成功與否
//
D3DPRESENT_PARAMETERS d3dParams;
memset(&d3dParams, 0, sizeof(d3dParams));
d3dParams.BackBufferFormat = d3ddm.Format;//緩衝屬性
d3dParams.SwapEffect = D3DSWAPEFFECT_DISCARD;//表面交換
d3dParams.Windowed = TRUE;//具有window視窗
d3dParams.EnableAutoDepthStencil = TRUE;
d3dParams.AutoDepthStencilFormat = D3DFMT_D16;//z-buffer位深
d3dParams.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
//這裡就應該建立成功了
int dwErr = g_pD3D->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dParams, NULL, &g_pD3DDvice);
if(D3DERR_DEVICELOST == dwErr)
{
AfxMessageBox(_T("dwErr :D3DERR_DEVICELOST"));
return;
}
if(NULL == g_pD3DDvice)
{
CString str;
str.Format(_T("dwErr :Create D3D Failure ,Error:%d"),dwErr);
AfxMessageBox(str);
return;
}
基本環境建立需求 :
1. include "d3d9.h"
2. link : d3d9.lib