維尼的蜂巢

RealTime??!! It’s amazing!!!!

D3D Create小小紀錄 九月 22, 2005

Filed under: DirectX — kevinlin @ 4:07 上午
之前都在寫core engine 對UI超級不熟 現在要來多練練
 
詢問顯示卡是否能符合我們給的一些東西
HRESULT CheckDeviceType(
   UINT Adapter,
   D3DFORMAT DisplayFormat,
   D3DFORMAT BackBufferFormat,
   BOOL Windowed
);
 
建構D3D裝置需要的參數
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;
 
  BackBufferWidthBackBufferHeight後備緩衝的寬度和高度。在全屏模式下,這兩者的值必需符合顯卡所支持的分辨率。例如(800600),(640480)。

       BackBufferFormat後備緩衝的格式。這個參數是一個D3DFORMAT枚舉類型,它的值有很多種,例如D3DFMT_R5G6B5,這說明後備緩衝的格式是每個像素16位,其實紅色(R)占5位,綠色(G)占6位,藍色(B)占5位,為什麼綠色會多一位呢?據說是因為人的眼睛對綠色比較敏感。DX9只支持16位和32位的後備緩衝格式,24位並不支持。如果對這D3DFORMAT不熟悉的話,可以把它設為D3DFMT_UNKNOWN,這時候它將使用桌面的格式。

       BackBufferCount後備緩衝的數目,範圍是從03,如果為0,那就當成1來處理。大多數情況我們只使用一個後備緩衝。使用多個後備緩衝可以使畫面很流暢,但是卻會造成輸入設備響應過慢,還會消耗很多內存。

       MultiSampleTypeMultiSampleQuality這兩個參數可以使你的渲染場景變得更好看,但是卻消耗你很多內存資源,而且,並不是所有的顯卡都支持這兩者的所設定的功能的。在這裡我們分別把它們設為D3DMULTISAMPLE_NONE0

       SwapEffect交換緩衝支持的效果類型。它是D3DSWAPEFFECT列舉類型,可以設定為以下三者之一:D3DSWAPEFFECT_DISCARDD3DSWAPEFFECT_FLIPD3DSWAPEFFECT_COPY。如果設定為D3DSWAPEFFECT_DISCARD,則後備緩衝區的東西被複製到螢幕上後,後備緩衝區的東西就沒有什麼用了,可以丟棄(discard)了。如果設定為D3DSWAPEFFECT_FLIP,則表示在顯示和後備緩衝之間進行週期循環。設定D3DSWAPEFFECT_COPY的話,我也不太清楚有什麼作用*^_^*。一般我們是把這個參數設為D3DSWAPEFFECT_DISCARD

       hDeviceWindow顯示設備輸出窗口的handle

       Windowed如果為FALSE,表示要渲染全螢幕。如果為TRUE,表示要渲染視窗。渲染全螢幕的時候,BackBufferWidthBackBufferHeight的值就得符合顯示模式中所設定的值。

       EnableAutoDepthStencil如果要使用Z緩衝,則把它設為TRUE

       AutoDepthStencilFormat如果不使用深度緩衝,那麼這個參數將沒有用。如果啟動了深度緩衝,那麼這個參數將為深度緩衝設定緩衝格式(和設定後備緩衝的格式差不多)

       Flags可以設置為0D3DPRESENTFLAG_LOCKABLE_BACKBUFFER。不太清楚是用來做什麼的,看字面好像是一個能否鎖定後備緩衝區的標記。

       FullScreen_RefreshRateInHz顯示器的更新頻率,單位是HZ,如果設定了一個顯示器不支持的更新頻率,將會不能創建設備或發出警告信息。為了方便,一般設為D3DPRESENT_RATE_DEFAULT就行了。

       PresentationInterval如果設置為D3DPRENSENT_INTERVAL_DEFAULT,則說明在顯示一個渲染畫面的時候必要等候顯示器刷新完一次螢幕。例如你的顯示器刷新率設為80HZ的話,則一秒內你最多可以顯示80個渲染畫面。另外你也可以設置在顯示器刷新一次螢幕的時間內顯示14個畫面。如果設置為D3DPRENSENT_INTERVAL_IMMEDIATE,則表示可以以即時的方式來顯示渲染畫面,雖然這樣可以提高frame(FPS),但是卻會產生圖像撕裂的情況。

 
 
D3D會發生的錯誤列舉 不知道有沒有寫好處理錯誤訊息的東西 就不用自己寫了
typedef enum {
    D3D_OK,
    D3DOK_NOAUTOGEN,
    D3DERR_CONFLICTINGRENDERSTATE,
    D3DERR_CONFLICTINGTEXTUREFILTER,
    D3DERR_CONFLICTINGTEXTUREPALETTE,
    D3DERR_DEVICELOST,
    D3DERR_DEVICENOTRESET,
    D3DERR_DRIVERINTERNALERROR,
    D3DERR_DRIVERINVALIDCALL,
    D3DERR_INVALIDCALL,
    D3DERR_INVALIDDEVICE,
    D3DERR_MOREDATA,
    D3DERR_NOTAVAILABLE,
    D3DERR_NOTFOUND,
    D3DERR_OUTOFVIDEOMEMORY,
    D3DERR_TOOMANYOPERATIONS,
    D3DERR_UNSUPPORTEDALPHAARG,
    D3DERR_UNSUPPORTEDALPHAOPERATION,
    D3DERR_UNSUPPORTEDCOLORARG,
    D3DERR_UNSUPPORTEDCOLOROPERATION,
    D3DERR_UNSUPPORTEDFACTORVALUE,
    D3DERR_UNSUPPORTEDTEXTUREFILTER,
    D3DERR_WASSTILLDRAWING,
    D3DERR_WRONGTEXTUREFORMAT,
    E_FAIL,
    E_INVALIDARG,
    E_INVALIDCALL,
    E_NOINTERFACE,
    E_NOTIMPL,
    E_OUTOFMEMORY,
    S_OK
} D3DERR;
 

       HRESULT CreatDevice(

              UINT Adapter,

              D3DDEVTYPE DeviceType,

              HWND hFocusWindow,

              DWORD BehaviorFlags,

              D3DPRESENT_PARAMETERS *pPresentationParameters,

              IDirect3DDevice9** ppReturnedDeviceInterface

       };

       第一個參數說明要為哪個設備創建設備指標,我之前說過一台機可以有好幾個顯卡,這個參數就是要指明為哪塊顯卡創建可以代表它的設備指標。但是我怎麼知道顯卡的編號呢?可以使用D3D接口裡面的函數來獲得,例如GetAdapterCounter可以知道系統有幾塊顯卡;GetAdapterIdentifier可以知道顯卡的具體屬性。一般我們設這個參數為D3DADAPTER_DEFAULT

       第二個參數指明正在使用設備類型。一般設為D3DEVTYPE_HAL

       第三個參數指明要渲染的視窗。如果為全螢幕模式,則一定要設為主視窗。

       第四個參數是一些標記,可以指定用什麼方式來處理頂點。

       第五個參數就要用到上面所講的D3DPRESENT_PARAMETERS

       第六個參數是返回的接口指標。

 

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s