Если уже имеется текстура 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 для строки. Можно ли привести пример или ссылку?