c++ - 在 DXGI 格式之间转换 RGBA 数据

标签 c++ windows texture2d render-to-texture direct3d11

我需要将 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

参见 MSDNDirect3D 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/

相关文章:

python - 如何 ssh 进入运行 cygwin/sshd 的 Windows 盒子并让生成的终端 session 使用 cygwin 而不是默认的 BASH?

c - 如何在按 CTRL + ALT + DEL 时停止此消息?

c++ - 将鼠标光标隐藏在 Windows 中的特定客户区域

Java JOGL 纹理对象未翻译

c++ - 删除锁定的互斥量

c++ - 如何在写入文件之前编码/加密结构

c++ - 为什么 std::string 使 WSAGetLastError 返回零?

c++ - pselect() 无法识别具有任何 IO 事件的套接字

texture2d - 我可以在像素着色器中创建平铺引擎吗?

某些设备上的 Android 'white box' 纹理 OpenGL ES 1.0