我對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 ::地圖調用的參數傳遞該格式,我會用指定的格式獲取數據。但那並不奏效。
紋理的DXGI_FORMAT在創建紋理時指定。將數據提供給OpenCV進行處理時,可能需要將r10g10b10a2數據「轉換」到b8r8g8a8中。 – VuVirt
我檢查了directxtex,但我認爲從OBS中的另一個地方獲取圖像對我而言會更容易。 – poster9238463