不需要绘制四边形,将纹理复制到屏幕缓冲区(OpenGL)

14

有没有一种快速的函数可以将纹理复制到屏幕缓冲区(不使用扩展)?

我需要一个 glCopyTexImage2D() 的反函数。

这样的函数存在吗?

1个回答

17
最接近的方法是glBlitFramebuffer。正如其名称所示,它是用于帧缓冲区的。是的,帧缓冲区可以包含纹理,但我不建议尝试使用它来替代使用四边形绘制纹理。使用四边形绘制纹理比复制帧缓冲区要获得更好的性能,特别是在绘制大量纹理时。
此外,绘制四边形绘制纹理的一种快速方法。

5
绘制四边形,即使考虑到将其全屏/无深度测试等状态改变,也非常快。其中最慢的部分是缓冲区到纹理的复制,但绘制速度足够快,使用缓冲区的乒乓方法可能更快。从后台缓冲区或前台缓冲区复制,甚至更糟的是向其复制,始终非常慢。 - ssube
在某些OpenGL实现中,glBlitFramebuffer实际上使用四边形渲染。而且,GPU使用完整的管道将一个FBO复制到另一个FBO,而不是像“memcpy”那样。但另一方面,它提供了执行缩放和过滤的能力。 - fen
8
在我的系统上(GTX 660),将一个纹理(包装在帧缓冲中)通过glBlitFramebuffer函数从一个帧缓冲传输到主帧缓冲比绘制一个矩形慢约20微秒。很有趣。 - subb
1
在我的GTX460上,我无法测量出使用blitting和绘制全屏四边形之间的性能差异。 - Tara
2
以上适用于从FBO复制到FBO。但是当我从FBO复制到后备缓冲区时,全屏四边形会稍微快一点。使用blitting进行从高分辨率缓冲区到低分辨率缓冲区的复制速度要慢得多。 - Tara
除了使用四边形外,三角形也可以用于屏幕贴图,并且具有更好的缓存友好性(在内存中更紧密地打包):https://rauwendaal.net/2014/06/14/rendering-a-screen-covering-triangle-in-opengl/ - StarShine

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