D3D 纹理转换格式

D3D Texture convert Format

我有一个格式为 DXGI_FORMAT_R10G10B10A2_UNORM 的 D3D11 Texture2d,我想将其转换为格式为 DXGI_FORMAT_R32G32B32A32_FLOATDXGI_FORMAT_R8G8B8A8_UINT 的 D3D11 Texture2d,因为这些纹理只能导入到CUDA.

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

但由于我对 D3D 知之甚少,所以无法做到这一点。 在理想情况下,我无需设置包括 IA、VS 等在内的整个渲染管道就可以完成这些工作...

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

在 GPU 上,您执行此转换的方式是 render-to-texture,它至少需要最小的 'offscreen' 渲染设置。

  1. 创建渲染目标视图(DXGI_FORMAT_R32G32B32A32_FLOATDXGI_FORMAT_R8G8B8A8_UINT 等)。这里的限制是它需要是一种格式,作为 Direct3D 硬件功能级别上的渲染目标视图。参见 Microsoft Docs

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

  3. 将源纹理作为 'full-screen quad' 渲染到 RTV。使用 Direct3D 硬件功能级别 10.0 或更高版本,您可以在顶点着色器中使用四边形 self-generated,因此您实际上不需要顶点缓冲区。参见 this code

鉴于您是从 DXGI_FORMAT_R10G10B10A2_UNORM 开始的,那么您几乎需要 Direct3D 硬件功能级别 10.0 或更高版本。这实际上使它变得非常容易。尽管您不需要 'swapchain'.

,但您仍然需要实际运行完整的渲染管道

You may find this tutorial helpful.