close

開始
DX程序第一件事是創建DX對象,相當於初始化DirectX。
LPDIRECT3D9X g_pD3D = Direct3DCreate9( D3D_SDK_VERSION);
if(NULL == g_pD3D) return E_FAILE;
每個程序都是由此開始的,而且寫法都一樣,參數必須是D3D_SDK_VERSION。

創建設備
DirectX是位於硬件抽象層上的設備,程序員通過訪問DX提供的接口來間接操作設備。設備大致分為
1. HAL設備。硬件抽象層的主要設備,硬件加速即在此處理。
2. 軟件設備。當某種特效硬件不支持,那麼可以用軟件的方法,讓CPU來計算,因此這稱為軟件設備。
3. 參考設備。無論有無硬件,都使用CPU來計算。
了解了設備的種類後,接下來就是創建設備了。
CreateDevice( UINT Adapter,
D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS *pPresentationParameters,
IDirect3DDevice9** ppReturnedDeviceInterface
);
Adapter 指定顯示適配器序列號,用於指示哪塊顯卡創建Direct3D對象,顯然,當有多塊顯卡時或顯卡上有多個接口時,這個參數能起來區分作用。我沒有找到如何獲取此值的API,只看文檔上提到“先取得顯卡設備,再枚舉Adpater”。通常這個參數D3DADAPTER_DEFAULT(這是一個宏,其值是當前適配器的序列號)。
DeviceType 這便是上面提到的3種設備。D3DDEVTYPE是個枚舉,D3DDEVTYPE_HAL代表HAL設備,通常也是取這個值。
hFocusWindow 指出那個窗口取得焦點。
BehaviorFlags 設備的工作方式。是一些細節問題,通常用D3DCREATE_SOFTWARE_VERTEXPROCESSING,表示頂點由軟件運算。
D3DPRESENT_PARAMETERS 本結構很複雜,也很重要。
typedef struct _D3DPRESENT_PARAMETERS_ {
UINT BackBufferWidth, BackBufferHeight;
D3DFORMAT BackBufferFormat;
UINT BackBufferCount;
D3DMULTISAMPLE_TYPE MultiSampleType;
DWORD MultiSampleQuality;
D3DSWAPEFFECT SwapEffect;
HWND hDeviceWindow;
BOOL Windowed;
BOOL EnableAutoDepthStencil;
D3DFORMAT AutoDepthStencilFormat;
DWORD Flags;
UINT FullScreen_RefreshRateInHz;
UINT PresentationInterval;
} D3DPRESENT_PARAMETERS;
●BackBufferWidth, BackBufferHeight 指定後台緩衝窗口的寬度和高度。當程序在非全屏模式下,如果它們為0,即是默認窗口的大小。
●BackBufferFormat 指定後台緩衝區像素格式。像素格式就不多說了。
●BackBufferCount 後台緩衝區的數量。可取0,1,2和3。取0時與到1一樣,表示1個緩衝區。緩衝區的數量與交換鏈有關,這個稍後討論。
●MultiSampleType 指定多重采樣數量。采樣越多,反鋸齒效果越好。
●MultiSampleQuality 多重采樣的質量。取值範圍是0到1,並且小於CheckDeviceMultiSampleType返值。因為反鋸齒效果需要一定資源,如果采樣數量過多或質量過高,可能系統達不到要求。所以如果需要反鋸齒,那麼最好用這個API檢測是否合適。
●SwapEffect 設置後台緩存複製到前台的方式。注意的是,如果設置不是D3DSWAPEFFECT_DISCARD(複製到前台後清除後台緩存內容)時,多重采樣必須是0( D3DMULTISAMPLE_NONE)。
●hDeviceWindow 指定圖形繪製窗口。默認時為當前被激活的窗口。
●Windowed 如果為TRUE,則以窗口方式顯示,反之以全屏方式顯示。
●EnableAutoDepthStencil,AutoDepthStencilFormat,Flags, FullScreen_RefreshRateInHz?

CreateDevice的參數差不多就講完了。最複雜的要數D3DPRESENT_PARAMETERS參數了,不過很多時候用默認值0就可以了,所以常見的CreateDevice是這樣寫的

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE; //窗口模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
//表示像素模式與適配器的相同
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
return E_FAIL;
Direct3D應用程序的基本結構
Direct3D應用程序的基本結構分為:
1. 初始化Direct3D
2. 渲染圖形
3. 如果程序不退出,GOTO 2
3. 結束Direct3D
上面CreateDevice部分大致就是Direct3D初始化了,接下來是渲染圖形
VOID Render( )
{
//清空後台緩衝區
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
//後台緩衝區繪製圖形
……

//線束後台緩衝區渲染
g_pd3dDevice->EndScene();
}
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
從這段代碼可以看出,DX圖形繪製是在後台緩衝區進行的,而且代碼位於BeginScene和EndScene之間。
清空後台緩衝區也是有意思函數,第一、二參數代表清空的區域,當設置為0和NULL時代表清空整個窗口。第三個參數是D3DCLEAR枚舉組合,它有三個值D3DCLEAR_TARGET,D3DCLEAR_ZBUFFER, D3DCLEAR_STENCIL。TARGET即表面象素的顏色,ZBUFFER即是深度緩衝區,STENCIL代表蒙板,打個比方,賽車遊戲中,車子窗外的景色的變,而車內的一般不變,所以可以設個蒙板,使每次刷新只改變窗外的區域。第四、五、六個參數就是分別對應上面三個枚舉值了。
提到渲染,一個重要的概念就是表面及表面管理。表面就像是存放在內存(顯存)中的一張位圖;前台緩衝區,是由顯卡傳送到顯示器的一塊內存,它是不能被DX寫入的;後台緩衝區,是DX真正繪圖的地方;表面翻轉(flipping surfaces),將後台提交到前台的過程稱之為表面翻轉;交換鏈,後台與前台表面指針所組成的循環鏈表,以便快速、有序地提交後台表面到前台,而且不必再分配新內存(原來的前台表面指針放到後台緩衝表面鏈表的後面,相當於把前台表面用於後台表面)。

arrow
arrow
    全站熱搜

    createps 發表在 痞客邦 留言(1) 人氣()