我想将 renderTarget 数组保存为图像文件以供调试。
但保存失败。
你知道如何将 renderTarget 数组保存为文件吗?
下面是我的代码。
ID3D11RenderTargetView** ppRTVs;
...
//rendering
...
ScratchImage ScratchImage;
ID3D11Resource* Resource;
wchar_t fileName[256];
ppRTVs[0]->GetResource(&Resource);
HRESULT hr = CaptureTexture(pd3dDevice, pd3dImmediateContext, Resource, ScratchImage);
if (FAILED(hr)) {
assert(FALSE);
}
for (int i = 0; i < ScratchImage.GetMetadata().arraySize; i++) {
const Image* singleTexture = ScratchImage.GetImage(0, i, 0);
swprintf_s(fileName, L"./Screenshots/city/color/texture_%zu.tga", i);
hr = SaveToTGAFile(*singleTexture, TGA_FLAGS_NONE, fileName); //failed
if (FAILED(hr)) {
assert(FALSE);
}
}
ScratchImage.m_methadata 信息
宽度=1920
高度=1080
深度 = 1
arr大小= 4
mip 级别 = 11
格式 = DXGI_FORMAT_R32G32B32A32_FLOAT (2)
尺寸 = TEX_DIMENSION_TEXTURE2D (3)
我需要帮助。
谢谢。
我认为它失败了,因为 TGA 文件不支持您的
DXGI_FORMAT_R32G32B32A32_FLOAT
格式。 根据 Microsoft,SaveToTGAFile 仅支持 RGBA8、BGRA5551、R8 和 A8 像素格式。
你有两个选择。
保存为另一种支持 FP32 像素的格式。很确定DDS格式支持它们,您可以通过调用同一库中的另一个函数
SaveDDSTextureToFile
来编写DDS文件。然后搜索可以查看该格式的 DDS 文件的图像查看器。
以某种方式将像素转换为RGBA8,然后保存到TGA。不幸的是,转换像素格式相对棘手,您要么需要编写并调度计算着色器,要么编写顶点+像素着色器并渲染全屏三角形。此外,这一步会丢失纹理中的一些信息。
附注使用像
ID3D11Resource* Resource
这样的原始 COM 指针并不是一个好主意,因为太容易泄漏内存。使用 CComPtr<ID3D11Resource>
代替,将在析构函数中自动释放对象。