我需要将 DXGI_FORMAT_R32G32B32A32_TYPELESS 类型的 ID3D11Texture2D 纹理有效地转换为 DXGI_FORMAT_B8G8R8A8_TYPELESS 类型(或任何其他 32 位 RGBA 类型)的纹理。基本上将每个像素纹理的 128 位减少到每个像素 32 位。看起来像 ID3D11DeviceContext::CopyResource-method 不能处理这样的格式转换。我应该使用着色器来实现吗?如果是,着色器是否可以与 CopyResource 方法一起使用,或者我是否需要设置完整的渲染管道?尝试在 CPU 上进行转换,但速度太慢。
最佳答案
一般来说,进行这些转换的最快方法是使用 GPU 将源格式纹理的“全屏四边形”渲染到目标格式的渲染目标。这些限制将基于支持呈现目标格式的 Direct3D 硬件功能级别。例如,在现代驱动程序的所有功能级别上,您可以指望 DXGI_FORMAT_B8G8R8A8_UNORM
被支持作为渲染目标,而不是 DXGI_FORMAT_B8G8R8A8_SNORM
。
参见 MSDN和 Direct3D Feature Levels
For a CPU-based fallback for all possible DXGI format conversions, see DirectXTex.
关于c++ - 在 DXGI 格式之间转换 RGBA 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42343338/