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

The*_*ind 6 graphics textures direct3d direct3d11

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

Unk*_*987 11

如果您的目的是将其用作另一个着色器的输入: - 只需确保使用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