(D3D11)在单独的线程上读取纹素

时间:2014-01-28 09:53:21

标签: direct3d direct3d11

在D3D10中,我将一个分段纹理加载到我的GPU内存上,然后映射它以便访问CPU上的纹素数据。这是在一个单独的线程上完成的,而不是我渲染的线程。我只是调用设备方法,它可以工作。

在D3D11中,我将分段纹理加载到我的GPU上,但要访问它(即映射它)我需要使用Context而不是设备。无法使用直接上下文,因为直接上下文一次只能由单个线程使用。但我也不能使用延迟上下文从纹理读取到CPU:

“如果在延迟上下文中调用Map,则只能将D3D11_MAP_WRITE_DISCARD,D3D11_MAP_WRITE_NO_OVERWRITE或两者传递给MapType参数。延迟上下文不支持其他D3D11_MAP类型的值。”

http://msdn.microsoft.com/en-us/library/ff476457.aspx

好的,那我现在该怎么办?通常使用纹理来存储某些数据(例如,高度图),您显然必须能够访问该数据才能使其有用。在D3D11的单独一个帖子中我没办法做到这一点吗?

1 个答案:

答案 0 :(得分:0)

您应该使用渲染线程上的直接上下文映射分段纹理,然后在第二个线程上使用您希望的内容。即使在D3D10中,映射纹理以进行读取的调用最终会在命令缓冲区中引入同步点(请参阅this article),从而有效地序列化线程。 D3D11 API努力阻止这样的隐藏性能成本。