如何将renderTarget数组保存到direct3D11中的文件中?

问题描述 投票:0回答:1

我想将 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)

我需要帮助。

谢谢。

save direct3d direct3d11 rendertarget
1个回答
0
投票

我认为它失败了,因为 TGA 文件不支持您的

DXGI_FORMAT_R32G32B32A32_FLOAT
格式。 根据 Microsoft,SaveToTGAFile 仅支持 RGBA8、BGRA5551、R8 和 A8 像素格式。

你有两个选择。

  1. 保存为另一种支持 FP32 像素的格式。很确定DDS格式支持它们,您可以通过调用同一库中的另一个函数

    SaveDDSTextureToFile
    来编写DDS文件。然后搜索可以查看该格式的 DDS 文件的图像查看器。

  2. 以某种方式将像素转换为RGBA8,然后保存到TGA。不幸的是,转换像素格式相对棘手,您要么需要编写并调度计算着色器,要么编写顶点+像素着色器并渲染全屏三角形。此外,这一步会丢失纹理中的一些信息。

附注使用像

ID3D11Resource* Resource
这样的原始 COM 指针并不是一个好主意,因为太容易泄漏内存。使用
CComPtr<ID3D11Resource>
代替,将在析构函数中自动释放对象。

© www.soinside.com 2019 - 2024. All rights reserved.