DirectX11. Как сделать преобразование текстуры из одного пиксельного формата в другой (RGBA -> BGRA)

Тема в разделе "WASM.DirectX", создана пользователем wmaster575, 22 сен 2017.

  1. wmaster575

    wmaster575 New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2017
    Сообщения:
    6
    Добрый день!
    В DirectX я новичок, многих вещей могу не знать.
    У меня есть текстура в памяти видеокарты в формате RGBA (DXGI_FORMAT_R8G8B8A8_UNORM). Это перехваченный буфер игры.
    Прежде чем скопировать её содержимое в память компьютера, мне нужно сделать преобразование этой текстуры в формат BGRA (DXGI_FORMAT_B8G8R8A8_UNORM). Как сделать преобразование текстуры из одного пиксельного формата в другой средствами видеокарты?
    Код (C++):
    1. // DXGI_FORMAT_R8G8B8A8_UNORM
    2. ID3D11Texture2D *pTexture1;
    3. // DXGI_FORMAT_B8G8R8A8_UNORM
    4. ID3D11Texture2D *pTexture2;
    5. D3D11_TEXTURE2D_DESC desc2 = {};
    6. desc2.Width = swapChainDesc.BufferDesc.Width;
    7. desc2.Height = swapChainDesc.BufferDesc.Height;
    8. desc2.MipLevels = 1;
    9. desc2.ArraySize = 1;
    10. desc2.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
    11. desc2.BindFlags = D3D10_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
    12. desc2.SampleDesc.Count = 1;
    13. desc2.Usage = D3D11_USAGE_DEFAULT;
    14. desc2.MiscFlags = 0;
    15.  
    16. //
    17. // Копирование содержимого одной текстуры в другую с преобразованием пиксельного формата.
    18. //
    19. void pixelConvert(ID3D11Texture2D *pTexture1, ID3D11Texture2D *pTexture2)
    20. {
    21.     //
    22.     // Код реализации. Как сделать?
    23.     //
    24. }
     
  2. Sashasan

    Sashasan New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2008
    Сообщения:
    23
    Адрес:
    Воронеж
    Сам не пробовал попробуй функцию
    Код (C++):
    1. D3DX11SaveTextureToMemory(
    2.          ID3D11DeviceContext *pContext,
    3.   __in   ID3D11Resource *pSrcTexture,
    4.   __in   D3DX11_IMAGE_FILE_FORMAT DestFormat,
    5.   __out  LPD3D10BLOB *ppDestBuf,
    6.   __in   UINT Flags );
    получаем ppDestBuf
    GetBufferPointer
    получаем адрес в оперативной памяти
    RGBA меняем местами байты BGRA каждого пикселя ну и все вроде :blush2:
     
    Последнее редактирование модератором: 13 ноя 2018