Windows C ++ быстрая текстура RGBA32 DX в буфер RGB24 - PullRequest
0 голосов
/ 17 апреля 2020

Если уже имеется текстура DirectX под рукой, каков быстрый (низкое использование ЦП) способ получить из нее буфер RGB24 в основной ОЗУ (пропустите A)?

Строго формат такое DXGI_FORMAT_B8G8R8A8_UNORM , означает ли это ARGB?

Я использую https://github.com/bmharper/WindowsDesktopDuplicationSample для захвата Windows рабочего стола, и результат должен быть преобразован в формат без потерь RGB24 в основной оперативной памяти .

Существующий код копирует текстуру GPU в текстуру CPU, а затем использует memcpy для копирования каждой строки данных RGBA32 в основное ОЗУ:

ID3D11Texture2D* gpuTex = nullptr;
hr                      = deskRes->QueryInterface(__uuidof(ID3D11Texture2D), (void**) &gpuTex);
....
ID3D11Texture2D* cpuTex = nullptr;
hr                      = D3DDevice->CreateTexture2D(&desc, nullptr, &cpuTex);
....
D3DDeviceContext->CopyResource(cpuTex, gpuTex);
....
D3D11_MAPPED_SUBRESOURCE sr;
hr = D3DDeviceContext->Map(cpuTex, 0, D3D11_MAP_READ, 0, &sr);
....    
for (int y = 0; y < (int) desc.Height; y++)
    memcpy(Latest.Buf.data() + y * desc.Width * 4, (uint8_t*) sr.pData + sr.RowPitch * y, desc.Width * 4);

Некоторый возможный способ:

(1) Можно ли позволить GPU преобразовать текстуру в текстуру RGB24 перед копированием в текстуру процессора? Как это сделать в DX?

(2) Если нет, то лучшим вариантом может быть какой-то ассемблерный код для замены строки memcpy

memcpy(Latest.Buf.data() + y * desc.Width * 4, (uint8_t*) sr.pData + sr.RowPitch * y, desc.Width * 4);

для преобразования RGBA32 в RGB24 для строки. Можно ли привести пример или ссылку?

...