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

8

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


你的意思是将像素读回到CPU,还是作为另一个着色器的输入? - jcoder
1个回答

13
如果您的目的是将其用作另一个着色器的输入: - 确保使用 D3D11_BIND_RENDER_TARGET 和 D3D11_BIND_SHADER_RESOURCE 创建了 texture2D。
  • 将纹理绑定为渲染目标并对其进行渲染。
  • 取消绑定纹理作为渲染目标,并将其绑定为着色器资源,在下一个着色器中使用它。
  • 请注意,一张纹理不能同时绑定为目标和资源。
如果您的目的是使用 C++ 作为像素数组在 CPU 上访问纹理,则需要进行一些工作。不幸的是,由于当前的 GPU 架构,无法直接访问 texture2D 的像素,因为像素实际上存储在 GPU 内存中,可能采用特殊格式(交错格式)。
  • 创建一个GPU可以渲染的纹理。
  • 创建一个暂存纹理(D3D11_USAGE_STAGING),用于接收GPU的输出。
  • 渲染到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)的数据指针,而不是根据行的实际字节宽度。 - Matt Kleinsmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接