2017-01-08 45 views
3

我有一個Direct3D 11渲染器,我正在實現共享表面以顯示WPF應用程序(僅使用Direct3D 9)中的內容。Direct3D9中支持的紋理格式

在D3D11方面,我的後臺緩衝區使用格式DXGI_FORMAT_R8G8B8A8_UNORM,這工作正常。根據this documentation DXGI_FORMAT_R8G8B8A8_UNORM映射到D3D9中的D3DFMT_A8B8G8R8。但是,當我使用該格式在D3D9端創建紋理時,它會失敗。我使用Windows 10,並且沒有D3D9調試運行時,所以我得到的只是一個D3DERR_INVALIDCALL,因此沒有附加信息。

This documentation似乎認爲只有ARGB格式支持D3D9中的後臺緩衝區,ABGR格式沒有在任何支持部分下列出。這是文檔中的錯誤還是這種格式完全不受支持?

如果我改爲在D3D11一側使用DXGI_FORMAT_B8G8R8A8_UNORM,而在D3D9一側紋理創建成功使用D3DFMT_A8R8G8B8。

對於進一步的混亂,this post意味着DXGI_FORMAT_R8G8B8A8_UNORM應該是兼容的格式,但它是我遇到的麻煩之一。

我也在GitHub上用Microsoft WPF DirectX Interop sample確認了這種行爲。開箱即用的是DXGI_FORMAT_R8G8B8A8_UNORM,並且工作正常,但如果我將後臺緩衝區更改爲DXGI_FORMAT_B8G8R8A8_UNORM,則會中斷。

爲什麼我的視頻卡支持的格式可以在一個API中工作,而不是在另一個API中工作?我怎麼知道D3D9支持哪些格式?

回答

1

堅持D3D11一側DXGI_FORMAT_B8G8R8A8_UNORM和D3D9 D3DFMT_A8R8G8B8。儘管DXGI_FORMAT_R8G8B8A8_UNORM在技術上更加兼容,但如果您不需要D3D10支持,則應在所有D3D11設備上支持。

我怎麼知道D3D9支持哪些格式?

您可以使用「DirectX Caps Viewer」(隨Visual Studio最新版本附帶的Windows SDK一起提供)獲得此版本(適用於您的系統)。有一部分「Direct3D9設備」。如果你擴展了你的適配器,然後D3D設備類型 - > HAL - >適配器格式,有部分backbuffer格式,它們支持哪些格式(附帶我的系統截圖)。

DirectX Caps Viewer

此相同的信息通過IDirect3D9::CheckDeviceFormat是在運行時可用。

本文檔似乎認爲只有ARGB格式支持D3D9中的後臺緩衝區,而ABGR格式未在任何支持部分列出。這是文檔中的錯誤還是這種格式完全不受支持?

D3D9不支持渲染爲ABGR格式,但理論上它可用作可採樣的格式。然而,它並不常用,並且通過我目前的驅動程序大小來看,它不受支持。最好堅持ARGB,它具有普遍的(但實際上並不能保證)支持。

0

BGRA(或ARGB)格式實際上在大多數PC上更兼容,因爲這是Windows GDI使用的像素格式。至少的NVidia建立了自己的GPU在考慮Windows的GDI像素格式,因此他們建議,爲了繞過任何昂貴的格式轉換使用BGRA代替RGBA:http://http.download.nvidia.com/developer/Papers/2005/Fast_Texture_Transfers/Fast_Texture_Transfers.pdf

如果你有使用D3DFMT_A8B8G8R8一個的Direct3D9回緩衝區(如果的Direct3D9會支持),然後在每次調用IDirect3DDevice9::Present()時,系統(或GPU)都必須切換每個後緩衝器像素的字節以匹配Windows GDI預期的內容,這是非常昂貴的操作。這種性能損失在OpenGL(其針對假設的「完美」GPU並通過在CPU上執行必要的轉換而允許許多不兼容的格式組合)允許的情況下顯而易見。