查詢深度緩衝區支援 (Direct3D 9)
如同任何功能,應用程式所使用的驅動程式可能不支援所有類型的深度緩衝處理。 請一律檢查驅動程式的功能。 雖然大部分驅動程式都支援 z 型深度緩衝,但並非所有驅動程式都支援 W 型深度緩衝。 如果您嘗試啟用不支援的配置,驅動程式就不會失敗。 他們會轉而依靠另一種深度緩衝方法,或有時完全停用深度緩衝,這可能會導致場景呈現出非常明顯的深度排序失真。
您可以在建立 Direct3D 裝置之前,查詢應用程式將使用的顯示裝置,以檢查對深度緩衝區支援的一般支援。 如果 Direct3D 物件報告它支援深度緩衝處理,您從這個 Direct3D 物件建立的任何硬體裝置都會支援 z 緩衝處理。
若要查詢深度緩衝支援,您可以使用 IDirect3D9::CheckDeviceFormat 方法,如下列程式代碼範例所示。
// The following example assumes that pCaps is a valid pointer to an
// initialized D3DCAPS9 structure
if(FAILED(m_pD3D->CheckDeviceFormat(pCaps->AdapterOrdinal,
pCaps->DeviceType,
AdapterFormat,
D3DUSAGE_DEPTHSTENCIL,
D3DRTYPE_SURFACE,
D3DFMT_D16)))
return E_FAIL;
IDirect3D9::CheckDeviceFormat 可讓您根據該裝置的功能選擇要建立的裝置。 在此情況下,不支援16位深度緩衝區的裝置會遭到拒絕。
使用 IDirect3D9::CheckDepthStencilMatch 來判斷轉譯目標的深度樣板相容性,如下列程式代碼範例所示。
// Reject devices that cannot create a render target of RTFormat while
// the back buffer is of RTFormat and the depth-stencil buffer is
// at least 8 bits of stencil
if(FAILED(m_pD3D->CheckDepthStencilMatch(pCaps->AdapterOrdinal,
pCaps->DeviceType,
AdapterFormat,
RTFormat,
D3DFMT_D24S8)))
return E_FAIL;
當您知道驅動程序支援深度緩衝區時,您可以驗證 w-buffer 支援。 雖然所有軟體轉譯器都支援深度緩衝區,但 w 緩衝區僅受參考轉譯器支援,不適用於真實世界應用程式。 無論您的應用程式使用何種裝置類型,在您嘗試啟用 w 型深度緩衝之前,請先確認 w 緩衝區的支援。
- 建立裝置之後,請呼叫 IDirect3DDevice9::GetDeviceCaps 方法,並傳遞初始化 D3DCAPS9 結構。
- 通話之後,LineCaps 成員會包含驅動程式支援繪圖基本要素的相關資訊。
- 如果此結構的 RasterCaps 成員包含D3DPRASTERCAPS_WBUFFER旗標,則驅動程式支援該基本類型的 w 型深度緩衝。
相關主題