从d3d11中的渲染目标读取像素数据

时间:2012-11-20 17:59:20

标签: graphics textures direct3d direct3d11

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

1 个答案:

答案 0 :(得分:12)

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

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

如果您的目的是使用C ++作为像素数组访问CPU上的纹理,那么您必须做一些工作。不幸的是,由于当前的GPU体系结构,不可能直接访问texture2D的像素,因为像素实际上以特殊格式(混合格式)存在于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