我将 a 设置texture2d
为设备渲染目标。绘制后,如何直接从渲染目标读取和写入像素,然后呈现。
问问题
9041 次
1 回答
13
如果您打算将其用作另一个着色器的输入: - 只需确保您使用 D3D11_BIND_RENDER_TARGET 和 D3D11_BIND_SHADER_RESOURCE 创建了 texture2D。
- 将纹理绑定为渲染目标并渲染到它。
- 将其解绑为渲染目标并将其绑定为着色器资源并在下一个着色器中使用。
- 请注意,纹理不能同时绑定为目标和资源。
如果您的意图是使用 C++ 作为像素数组访问 CPU 上的纹理,那么您必须做一些工作。不幸的是,由于当前的 GPU 架构,不可能直接访问纹理 2D 的像素,因为像素实际上以特殊格式(混合格式)存在于 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
于 2013-02-20T13:27:20.500 回答