Я создал красную текстуру формата 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
Map(DISCARD)
, он возвращал вам пустой буфер, потому что этот флаг указывает, что драйвер может свободно использовать переименование буфера и не заставлять GPU ждать, пока буфер больше не будет использоваться. Этот шаблон предназначен для оптимизации WRITE, а не READBACK. - person Chuck Walbourn   schedule 06.01.2019