3D遊戲基礎 Direct3D(二) D3D初始化

來源:互聯網
上載者:User
註:後續D3D的講解,均基於C++進行。

在解釋D3D初始化之前,先介紹一下幾個先導概念。
1、D3D的SDK向開發人員提供兩種裝置類型:參考裝置(Reference Device or REF) 和  硬體抽象層裝置(Hardware Abstract Layer or HAL)。
這兩種裝置的區別在於: REF是採用軟體類比的方式來進行三維運算,全部計算都在CPU來完成,它確保所使用的功能完全正確,但效率低下,僅為開發人員開發,提供驗證用功能;而HAL則採用硬體加速卡來進行計算。REF只在開發時可用,不能發布。
在D3D中,採用 D3DDEVTYPE_HAL 和 D3DDEVTYPE_REF 兩個宏來區分。
2、反走樣(Antialiasing)
在有限解析度的顯示器上,映像都是由一個一個顯像的小格子組成。而格子都是正規的一行一行排列的,這就帶來一個問題,在顯示斜線的時候,可能會有鋸齒狀的映像出來,從而使映像的視覺效果變差。人們為了緩解這個問題,發展出了反走樣技術。
它是根據人眼的特性發展出來的,原理就是在鋸齒邊緣再用一些近似的過度的顏色來填充,從而使鋸齒邊緣看起來像是一個平滑的過度。
實現反走樣的一般方法就是:首先把要畫的映像按比例放大,如2倍、4倍等等。然後按放大後的尺寸在記憶體中進行繪製。最後,我們把這幅大圖再縮小n倍,那麼從 n倍映射到1倍的過程中,我們需要一個採樣運算。以2倍為例,我們就需要把大圖中相鄰的橫豎各2個,總共4個像素值做加權平均 得到對應的一個像素的顏色。
反走樣演算法雖然簡單,但卻非常佔用資源,所以,在即時渲染中,盡量不要使用過高的反走樣層級。
在D3D中,反走樣分為 D3DMULTISAMPLE_NONE、D3DMULTISAMPLE_1_SAMPLE ...... D3DMULTISAMPLE_16_SAMPLE 一共16級
3、像素的儲存格式
D3DFMT_R8G8B、D3DFMT_X8R8G8B8、D3DFMT_A8R8G8B8、D3DFMT_A16R16G16B16、D3DFMT_A32R32G32B32
4、記憶體池的分類
D3DPOOL_DEFAULT:預設
D3DPOOL_MANAGE:D3D代管模式
D3DPOOL_SYSTEMMEM:系統儲存區,D3D裝置無法訪問的
D3DPOOL_SCRATCH:系統儲存區(不同於前一個)

D3D的初始化:
1、初始化前
從COM獲得一個D3D介面指標
IDirect3D9  *pd3d  = Direct3DCreate9(D3D_SDK_VERSION);

2、檢查硬體是否支援相關特性
這個過程主要是用於檢查硬體是否支援如反走樣、著色器的支援程度等特性。
HRESULT IDirect3D9::GetDeviceCaps(
                                                    UINT Adapter, //[IN] 顯卡編號,通常只有一個顯卡
                                                    D3DDEVTYPE DeviceType, //[IN] 裝置類型,REF or HAL
                                                    D3DCAPS9 *pCaps);//[OUT] 裝置的基本效能資料
如:
D3DCAPS9 caps;
pd3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);

驗證是否帶有硬體3D加速能力(即硬體的頂點變換和光照計算能力):
int vp = 0;
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
    vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
    vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}

驗證著色器版本
if(caps.PixelShaderVersion < D3DPS_VERSION(2, 0))

3、設定待初始化的D3D裝置的參數
D3DPRESENT_PARAMETERS para;
詳細資料可以查閱D3D協助。

4、開始初始化
IDirect3DDevice9 *pdevice = 0;
HRESULT hr = pd3d->CreateDevice(
        D3DADAPTER_DEFAULT, //[IN]使用預設顯卡
        D3DDEVTYPE_HAL,//[IN]使用HAL方式
        hwnd,//[IN]關聯的視窗
        vp,//[IN]頂點處理方式
        &para,//[IN]裝置參數
        &pdevice); //[OUT]裝置

5、注意檢查是否初始化成功了
if(FAILED(hr))
{
    ::MessageBox(0, "Create Device Failed!!", 0, 0);
    return 0;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.