D3D纹理转换格式

LRK*_*LRK 3 cuda direct3d pixel-shader

我有一个具有以下格式的 D3D11 Texture2d DXGI_FORMAT_R10G10B10A2_UNORM,并希望将其转换为具有DXGI_FORMAT_R32G32B32A32_FLOATDXGI_FORMAT_R8G8B8A8_UINT格式的 D3D11 Texture2d,因为这些纹理只能导入到 CUDA 中。

出于性能原因,我希望它完全在 GPU 上运行。我读到一些线程建议,我应该将第二个纹理设置为渲染目标并将第一个纹理渲染到其上,或者通过像素着色器转换纹理。

但由于我对 D3D 不太了解,所以我无法这样做。在理想的世界中,我无需设置整个渲染管道(包括 IA、VS 等)就可以完成这些工作...

有人可能有这方面的例子或任何提示吗?提前致谢!

Chu*_*urn 5

在 GPU 上,执行此转换的方式是渲染到纹理,这至少需要最小的“离屏”渲染设置。

  1. 创建渲染目标视图(DXGI_FORMAT_R32G32B32A32_FLOATDXGI_FORMAT_R8G8B8A8_UINT等)。这里的限制是它必须是 Direct3D 硬件功能级别上支持作为渲染目标视图的格式。请参阅微软文档

  2. 为您的源纹理创建 SRV。同样,需要由 Direct3D 硬件设备功能级别支持纹理。

  3. 将源纹理作为“全屏四边形”渲染到 RTV。使用 Direct3D 硬件功能级别 10.0 或更高版本,您可以在顶点着色器中自行生成四边形,因此您实际上不需要为此使用顶点缓冲区。请参阅这段代码

鉴于您从 开始DXGI_FORMAT_R10G10B10A2_UNORM,那么您几乎需要 Direct3D 硬件功能级别 10.0 或更高。这实际上使它变得非常容易。尽管您不需要“交换链”,但您仍然需要实际运行完整的渲染管道。

您可能会发现本教程很有帮助。