close

D3DPRESENT_PARAMETERS 參數說明


struct D3DPRESENT_PARAMETERS{
    UINT BackBufferWidth;
    UINT 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;
};


BackBufferWidth和BackBufferHeight:

後備緩衝的寬度和高度。在全屏模式下,這兩者的值必需符合顯卡所支持的分辨率。例如(800,600),(640,480)。


BackBufferFormat:

後備緩衝的格式。這個參數是一個D3DFORMAT枚舉類型,它的值有很多種,例如D3DFMT_R5G6B5、D3DFMT_X8R8G8B8為遊戲後備緩衝常用格式,這說明後備緩衝的格式是每個像素16位,其實紅色(R)占5位,綠色(G)占6位,藍色(B)占5位,為什麼綠色會多一位呢?據說是因為人的眼睛對綠色比較敏感。

DX9隻支持16位和32位的後備緩衝格式,24位並不支持。如果對這D3DFORMAT不熟悉的話,可以把它設為D3DFMT_UNKNOWN,這時候它將使用桌面的格式。


BackBufferCount:

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


MultiSampleType和MultiSampleQuality:

前者指的是全屏抗鋸齒的類型,後者指的是全屏抗鋸齒的質量等級。這兩個參數可以使你的渲染場景變得更好看,但是卻消耗你很多內存資源,而且,並不是所有的顯卡都支持這兩者的所設定的功能的。在這裡我們分別把它們設為D3DMULTISAMPLE_NONE和0。

可以通過CheckDeviceMultiSampleType 來檢測當前裝置是否支持某個抗鋸齒類型
typedef enum _D3DMULTISAMPLE_TYPE
{
    D3DMULTISAMPLE_NONE            =  0,
    D3DMULTISAMPLE_2_SAMPLES       =  2,
    D3DMULTISAMPLE_3_SAMPLES       =  3,
    D3DMULTISAMPLE_4_SAMPLES       =  4,
    D3DMULTISAMPLE_5_SAMPLES       =  5,
    D3DMULTISAMPLE_6_SAMPLES       =  6,
    D3DMULTISAMPLE_7_SAMPLES       =  7,
    D3DMULTISAMPLE_8_SAMPLES       =  8,
    D3DMULTISAMPLE_9_SAMPLES       =  9,
    D3DMULTISAMPLE_10_SAMPLES      = 10,
    D3DMULTISAMPLE_11_SAMPLES      = 11,
    D3DMULTISAMPLE_12_SAMPLES      = 12,
    D3DMULTISAMPLE_13_SAMPLES      = 13,
    D3DMULTISAMPLE_14_SAMPLES      = 14,
    D3DMULTISAMPLE_15_SAMPLES      = 15,
    D3DMULTISAMPLE_16_SAMPLES      = 16,
    D3DMULTISAMPLE_FORCE_DWORD     = 0x7fffffff
} D3DMULTISAMPLE_TYPE;
//type 為以上的枚舉值


D3DMULTISAMPLE_TYPE type;
int quality; //獲取相對於type的最大質量等級(設置type抗拒值類型時,設置的質量等級只能小於這個數)
//m_d3dBackFmt 為後備緩衝格式,m_bWindowed 是否為窗口模式,
m_pD3D9->CheckDeviceMultiSampleType( D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,m_d3dBackFmt, m_bWindowed,type,&quality );


SwapEffect:

交換緩衝支持的效果類型,指定表面在交換鏈中是如何被交換的。它是D3DSWAPEFFECT枚舉類型,可以設定為以下三者之一:D3DSWAPEFFECT_DISCARD,D3DSWAPEFFECT_FLIP,D3DSWAPEFFECT_COPY。
如果設定為D3DSWAPEFFECT_DISCARD,則後備緩衝區的東西被複製到屏幕上後,後備緩衝區的東西就沒有什麼用了,可以丟棄(discard 是否丟棄由顯卡決定,但不再等待)了。

如果設定為D3DSWAPEFFECT_FLIP,後備緩衝拷貝到前台緩衝,保持後備緩衝內容不變。當後備緩衝大於1個時使用。

設定D3DSWAPEFFECT_COPY的話, 後備緩衝拷貝到前台緩衝,保持後備緩衝內容不變。當後備緩衝等於1個時使用。

一般我們是把這個參數設為D3DSWAPEFFECT_DISCARD。如果想使用GetBackBuffer 獲得後備緩衝內容打印屏幕畫面。則不能使用DISCARD.

很懷疑用DISCARD效率會好的說法。在我的8600GT 上_COPY 明顯好於DISCARD. discard 做法是再次使用後備緩衝時 new 一個新的緩衝,舊的緩衝內容遺棄,如果還有使用舊的緩衝地方,不會影響新的內容,如使用抗鋸齒必須是DISCARD。這樣不用等待硬件同步。不過大部分是一次Present操作。用COPY在新機器上面反倒效率好些。畢竟new 一個 1440*900 的後台緩衝也是有消耗的。(對於DISCARD 做法僅僅是猜測。不同顯卡可能不同。)


hDeviceWindow:

顯示設備輸出窗口的句柄
Windowed:如果為FALSE,表示要渲染全屏。如果為TRUE,表示要渲染窗口。渲染全屏的時候,BackBufferWidth和BackBufferHeight的值就得符合顯示模式中所設定的值。


EnableAutoDepthStencil:

如果要使用Z緩衝或模板緩衝,則把它設為TRUE。


AutoDepthStencilFormat:

如果不使用深度緩衝,那麼這個參數將沒有用。如果啟動了深度緩衝,那麼這個參數將為深度緩衝設定緩衝格式。常用值D3DFMT_24S8 (24 深度緩衝,8模板緩衝),D3DFMT_24X8(24 深度緩衝),D3DFMT_16(16深度緩衝)等等。
//深度緩存和模板緩存的象素格式,如 D3DFMT_D24S8 , 24 位表示深度,8位為模板緩存。一般不會用到32位深度:D3DFMT_32
//注意如果設置模板緩衝在Clear() 函數中也要清楚模板緩衝:設置參數 D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL


Flags:

通常為0 或D3DPRESENTFLAG_LOCKABLE_BACKBUFFER。不太清楚是用來做什麼的,看字面好像是一個能否鎖定後備緩衝區的標記。D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL 丟棄模板緩衝區。


FullScreen_RefreshRateInHz:

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


PresentationInterval:

如果設置為D3DPRENSENT_INTERVAL_DEFAULT,則說明在顯示一個渲染畫面的時候必要等候顯示器刷新完一次屏幕。例如你的顯示器刷新率設為80HZ的話,則一秒內你最多可以顯示80個渲染畫面。

另外你也可以設置在顯示器刷新一次屏幕的時間內顯示1到4個畫面。如果設置為D3DPRENSENT_INTERVAL_IMMEDIATE,則表示可以以實時的方式來顯示渲染畫面,雖然這樣可以提高幀速(FPS),如果速度過快卻會產生圖像撕裂的情況,但當遊戲完成時,幀速度一般不會過快。

Dxut 框架 ModifyDeviceSettings 函數中修改 DXUTDeviceSettings* pDeviceSettings 成員(D3DPRESENT_PARAMETERS變量) pp來修改

arrow
arrow
    全站熱搜

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