2017-08-11 88 views
1

我對directx不熟悉,但遇到了一個小項目中的問題,其中一部分涉及捕獲directx數據。我希望,下面我會說一些道理。什麼因素決定DXGI_FORMAT?

一般問題:

我想知道是什麼因素決定的後備緩衝紋理的DXGI_FORMAT(硬件?OS?,?,應用DirectX版本?)。更重要的是,當從後緩衝區捕捉紋理時,可以通過提供格式作爲參數來接收所需格式的紋理,並根據需要自動轉換格式。

的具體信息我的問題:

我使用Open轉播軟件(OBS)捕捉遊戲畫面和使用之前,流特定庫(OpenCV的)處理它們。我注意到,在更新Windows和OBS之後,我將'DXGI_FORMAT_R10G10B10A2_UNORM'作爲DXGI_FORMAT。這對我來說是個問題,因爲據我所知,當顏色爲10位時,OpenCV沒有提供構建OpenCV對象的便捷方式。以下是修改後的OBS源文件中的一些相關行。

d3d11_copy_texture(data.texture, backbuffer); 
... 
hlog(toStr(data.format)); // prints 24 = DXGI_FORMAT_R10G10B10A2_UNORM 
... 
ID3D11Texture2D* tex; 
bool success = create_d3d11_stage_surface(&tex); 
if (success) { 
    ... 
    HRESULT hr = data.context->Map(tex, subresource, D3D11_MAP_READ, 0, &mappedTex); 
    ... 
    Mat frame(data.cy, data.cx, CV_8UC4, mappedTex.pData, (int)mappedTex.RowPitch); //This creates an OpenCV Mat object. 
               //No support for 10-bit coors. Expects 8-bit colors (CV_8UC4 argument). 
               //When the resulting Mat is viewed, colours are jumbled (Probably because 10-bits did not fit into 8-bits). 

更新之前(當我一年前在做這個),我可能接受DXGI_FORMAT = DXGI_FORMAT_B8G8R8A8_UNORM,因爲上面的代碼用來工作。

現在我想知道是什麼改變了,以及我是否可以修改OBS的源代碼來接收具有所需DXGI_FORMAT的數據。

上面調用的'create_d3d11_stage_surface'方法設置了DXGI_FORMAT,但我不確定它是否意味着'給我這個DXGI_FORMAT的數據'或'我知道你使用這種格式,給我你所擁有的'。

static bool create_d3d11_stage_surface(ID3D11Texture2D **tex) 
{ 
    HRESULT hr; 

    D3D11_TEXTURE2D_DESC desc  = {}; 
    desc.Width      = data.cx; 
    desc.Height     = data.cy; 
    desc.Format = data.format; 
    ... 

我希望隨着DXGI_FORMAT_B8G8R8A8_UNORM重寫desc.Format會導致在上面的ID3D11DeviceContext ::地圖調用的參數傳遞該格式,我會用指定的格式獲取數據。但那並不奏效。

+0

紋理的DXGI_FORMAT在創建紋理時指定。將數據提供給OpenCV進行處理時,可能需要將r10g10b10a2數據「轉換」到b8r8g8a8中。 – VuVirt

+0

我檢查了directxtex,但我認爲從OBS中的另一個地方獲取圖像對我而言會更容易。 – poster9238463

回答

0

渲染目標的選擇取決於應用程序,但他們需要根據Direct3D硬件功能級別選擇渲染目標。在swapchains格式渲染目標通常顯示掃描輸出格式:

DXGI_FORMAT_R8G8B8A8_UNORM 
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB 
DXGI_FORMAT_B8G8R8A8_UNORM 
DXGI_FORMAT_B8G8R8A8_UNORM 
DXGI_FORMAT_R10G10B10A2_UNORM 
DXGI_FORMAT_R16G16B16A16_FLOAT 
DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM (rare) 

通過特徵級的支持格式和用途的完整列表,請參閱DXGI documentation

當您複製資源(如複製到暫存渲染紋理等資源時,Direct3D 11不執行格式轉換,因此如果要進行格式轉換,則需要自己處理。請注意,所有DXGI格式的CPU端轉換代碼可在DirectXTex中找到。

+0

所以在我的情況下,它是設置格式的遊戲(基於硬件功能級別)。 – poster9238463

0

它是決定該格式的應用程序。最簡單的是R8G8B8A8,它只是表示RGB和alpha值。但是,如果開發人員決定他將使用HDR,後備緩衝器可能是R11B11G10,因爲您可以在那裏存儲更精確的數據,而無需Alpha通道信息。如果遊戲是黑白的,則不需要將所有RGB通道保留在後臺緩衝區中,可以使用更簡單的格式。我希望這有幫助。

相關問題