【问题标题】:read pixel data from render target in d3d11从 d3d11 中的渲染目标读取像素数据
【发布时间】:2012-11-08 21:03:49
【问题描述】:

我将texture2d 设置为设备渲染目标。绘制完成后,如何直接从渲染目标读取和写入像素,然后呈现出来。

【问题讨论】:

  • 您的意思是将像素读回 CPU,还是作为另一个着色器的输入?

标签: graphics textures direct3d direct3d11


【解决方案1】:

如果您的意图是将其用作另一个着色器的输入: - 只需确保您使用 D3D11_BIND_RENDER_TARGET 和 D3D11_BIND_SHADER_RESOURCE 创建了 texture2D。

  • 将纹理绑定为渲染目标并渲染到它。
  • 将其解除绑定为渲染目标并将其绑定为着色器资源并在下一个着色器中使用。
  • 请注意,纹理不能同时绑定为目标和资源。

如果您的意图是使用 C++ 作为像素数组访问 CPU 上的纹理,那么您必须做一些工作。不幸的是,由于当前的 GPU 架构,无法直接访问纹理 2D 的像素,因为这些像素实际上以特殊格式(swizzled 格式)存在于 GPU 内存潜力中。

  • 创建 GPU 可以渲染到的纹理。
  • 创建将用于接收 GPU 输出的暂存纹理 (D3D11_USAGE_STAGING)。
  • 渲染到 GPU 纹理。
  • 发出 ID3D11DeviceContext::CopyResource() 或 ID3D11DeviceContext::CopySubresource()
  • 在暂存资源上调用 ID3D11DeviceContext::Map() 以访问像素。
  • 在暂存资源上调用 ID3D11DeviceContext::Unmap()。
  • 调用 ID3D11DeviceContext::UpdateSubresource() 来更新 GPU 拥有的资源的版本。

如您所见,这肯定不是一组微不足道的操作,并且与当今 GPU 架构的优化目标背道而驰。我当然不会推荐它。

如果您最终走上了这条路,请务必阅读 GPU 内存回读带来的所有性能问题:http://msdn.microsoft.com/en-us/library/windows/desktop/bb205132(v=vs.85).aspx#Performance_Considerations

【讨论】:

  • 提示:纹理中的行不保证是连续的。将数据从 D3D11Texture2D 复制到 RAM 时,需要根据其RowPitch 成员而不是根据行的实际字节宽度来增加映射纹理的数据指针(D3D11_MAPPED_SUBRESOURCE)。
猜你喜欢
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 2017-09-15
相关资源
最近更新 更多