SaveDDSTextureToFile() сохраняет черную текстуру вместо ожидаемой.

Я создал красную текстуру формата DXGI DXGI_FORMAT_R32_FLOAT. У меня есть байтовый буфер пикселей красного цвета, где подготовлено 4 байта на пиксель. Затем байтовый буфер копируется с использованием карты контекста устройства и функций отмены карты, после чего я создал представление ресурсов шейдера. Я вернул ресурс из представления ресурсов, а затем передал его в SaveDDSTextureToFile(), чтобы сохранить данные растрового изображения в формате файла dds. Но когда я собираюсь сохранить его в файле dds, чтобы проверить, он сохраняет текстуру того же размера, которая полностью черная. Где я должен искать для отладки?

    D3D11_TEXTURE2D_DESC desc;
    ZeroMemory(&desc, sizeof(desc));
    desc.Width = static_cast<UINT>(renderTarget.width);
    desc.Height = static_cast<UINT>(renderTarget.height);
    desc.ArraySize = 1;
    desc.Format = DXGI_FORMAT_R32_FLOAT;
    desc.Usage = D3D11_USAGE_DYNAMIC;
    desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
    desc.MipLevels = 1;
    desc.SampleDesc.Count = 1;

    ...

SaveDDSTextureToFile(renderer->Context(), texture2D, L"D:\\RED.dds");

Я создал красный буфер текстуры следующим образом:

CImage m_cImage;
// create a test image
m_cImage.Create(w, -h, 8 * 4); // 8 bit * 4 channel => 32 bpp or 4 byte per pixel
auto hdc = m_cImage.GetDC();
Gdiplus::Graphics graphics(hdc);

// Create a SolidBrush object.
Gdiplus::SolidBrush redBrush(Gdiplus::Color::Red);

// Fill the rectangle.
Gdiplus::Status status = graphics.FillRectangle(&redBrush, 0, 0, w, h);
TRY_CONDITION(status == Gdiplus::Status::Ok);
....
// Then saved the m_cImage.GetBits() to bmp file using Gdiplus::Bitmap
// and my expected texture is found

person Tajuddin Khandaker    schedule 24.12.2018    source источник
comment
Ваш ресурс имеет доступ только для записи от ЦП, поэтому, вероятно, произойдет сбой при попытке скопировать его обратно. Вы можете включить устройство отладки и искать любую дополнительную диагностическую информацию.   -  person Chuck Walbourn    schedule 30.12.2018
comment
Я использовал D3D11_MAP_WRITE_DISCARD во время вызова ID3D11DeviceContext::Map() для настройки доступа виртуальной памяти к ресурсу текстуры. Это правильно? Я вижу, что ScreenGrab.cpp использует эквивалент WIC GUID_WICPixelFormat32bppGrayFloat, сохраняя формат файла dds, который в моем случае показывает черную текстуру вместо красной.   -  person Tajuddin Khandaker    schedule 06.01.2019
comment
Когда вы вызывали Map(DISCARD), он возвращал вам пустой буфер, потому что этот флаг указывает, что драйвер может свободно использовать переименование буфера и не заставлять GPU ждать, пока буфер больше не будет использоваться. Этот шаблон предназначен для оптимизации WRITE, а не READBACK.   -  person Chuck Walbourn    schedule 06.01.2019