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來修改
留言列表