将后缓冲直接复制到显存
Posted
技术标签:
【中文标题】将后缓冲直接复制到显存【英文标题】:Copy backbuffer directly to video memory 【发布时间】:2014-12-13 15:41:48 【问题描述】:有没有办法直接将backbuffer数据复制到显存中?我的意思是不使用系统内存。到目前为止,我发现的所有方法(如 this 或 this)都将后台缓冲区内容复制到系统内存中,这需要大量时间。
我的任务是在视频内存中创建一个表面或纹理,并告诉图形适配器直接将后台缓冲区复制到那里,而不使用总线。谢谢
【问题讨论】:
并直接使用fbo渲染到纹理?比您可以使用带纹理的四边形通过简单的绘制调用复制到后台缓冲区... 另一种替代方法,但由于您必须等待渲染赶上才能读取而引入延迟的方法是使用像素缓冲区对象。 您能否更详细地解释一下您打算使用后备缓冲区*做什么*? 如果您尝试像 FRAPS 那样捕获视频,那么像素缓冲区对象实际上是一个更合适的选择——它会引入一些帧延迟,但在那种情况下这是可以接受的。 另外,为什么这会同时标记 OpenGL 和 DirectX? 感谢您的回答。我正在尝试捕获显示内容,然后使用着色器在 GPU 上对其进行处理。所以我没有渲染任何东西,只是抓取屏幕并处理它,然后从 GPU 读取少量结果数据。 对于 OpenGL 和 DirectX - 只要能够完成这项任务,它们中的任何一个都可以。 @Isso:这实际上有点棘手......您是要获取整个屏幕的内容,还是仅获取单个窗口的内容? 【参考方案1】:顺便说一句,后台缓冲区已经在视频内存中——只是当你需要它时不一定完成。您的性能问题实际上可能是由于在等待渲染完成时强制管道停顿;从你的描述很难说。
如果您绘制到 FBO 图像附件,您可以这样做而不会导致停顿,但您将绘制到单独的缓冲区而不是窗口系统的交换链(后缓冲区)。因此,当您交换缓冲区时,结果不会出现在屏幕上,您必须手动调用 glBlitFramebuffer (...)
或使用您附加到 FBO 作为纹理的图像绘制一个带纹理的四边形。
【讨论】:
安东,谢谢你的回答。我没有渲染任何东西,我只需要捕获显示内容,然后使用着色器在GPU上对其进行处理,最后将处理结果(即少量数据)读取到系统内存中。以上是关于将后缓冲直接复制到显存的主要内容,如果未能解决你的问题,请参考以下文章
将 OpenGL 后台缓冲区直接复制到 GDI DC 像素数据上