如何将一个ID3D11Texture2D转换成任意图片格式

How to transform a ID3D11Texture2D into any picture format

我有一个 ID3D11Texture2D 并想使用几乎任何图片格式(png、bmp、jpeg 等)将其写入磁盘。 我已经尝试阅读文档 https://docs.microsoft.com/en-us/windows/win32/api/d3d11/nn-d3d11-id3d11texture2d, which are less than helpful, and i have found an NVIDIA tutorial of how to take individual ID3D11Texture2D and convert them into a video: https://github.com/NVIDIA/video-sdk-samples/tree/master/nvEncDXGIOutputDuplicationSample

但是,我找不到任何方法可以简单地将它以任何格式写入磁盘。我确定我遗漏了一些明显的东西,任何提示都将不胜感激。

为了实验,我使用了 https://github.com/NVIDIA/video-sdk-samples/tree/master/nvEncDXGIOutputDuplicationSample,将要捕获的帧设置为 1,并尝试在编码为视频之前将 ID3D11Texture2D 写入文件。

我在 ScreenGrab 模块中有一个解决方案,它捕获纹理(如果还没有在 Map-supporting 内存中),然后将其写为图片使用 WIC。它也处理一些 edge-cases,例如“无类型”资源和 MSAA。

'standalone' 版本作为 DirectXTex 包的一部分在 GitHub 上:

https://github.com/microsoft/DirectXTex/blob/main/ScreenGrab/ScreenGrab11.h

https://github.com/microsoft/DirectXTex/blob/main/ScreenGrab/ScreenGrab11.cpp

文档是 here

ScreenGrab 也包含在 DirectX 工具包 中用于 DX11 and DX12DirectXTex 包中也有基本的 DX9 版本。

ScreenGrab can write to any file container supported by WIC. It also has buit-in support for writing DDS files directly without using WIC.

除了使用 ScreenGrab(旨在作为 light-weight 屏幕截图解决方案)之外,您还可以使用 DirectTex 库来捕获纹理然后将其保存为 DDS、HDR、TGA 或任何 WIC-supported 文件格式。