GL_DRAW/READ_FRAMEBUFFER 与 GL_FRAMEBUFFER?

Posted

技术标签:

【中文标题】GL_DRAW/READ_FRAMEBUFFER 与 GL_FRAMEBUFFER?【英文标题】:GL_DRAW/READ_FRAMEBUFFER vs GL_FRAMEBUFFER? 【发布时间】:2011-12-17 18:01:09 【问题描述】:

我注意到现在有 GL_DRAW/READ_FRAMEBUFFER 扩展。目前我只是使用 GL_FRAMEBUFFER 和 glTextureBarrierNV。但是,我没有发现太多关于 READ/WRITE 扩展的信息,因此有一些问题。

他们引入了什么 OpenGL 版本? 与简单地使用 GL_FRAMEBUFFER 进行读写相比,它们有什么优势? 在哪里可以找到有关此的更多信息?

【问题讨论】:

您是指GL_DRAW/READ_FRAMEBUFFER 绑定点吗? 【参考方案1】:

迂腐提示:GL_DRAW/READ_FRAMEBUFFER 没有在扩展中引入;它们是核心 OpenGL 3.0 功能。是的,从技术上讲,此功能也暴露在 ARB_framebuffer_objects 中,但那是 core extension,它仍然是核心 GL 3.0。

无论如何,如果你想要DRAW/READ区分的词源,你需要查看EXT_framebuffer_blit。这就是那些枚举器的起源,这就是为什么这些枚举器存在。他们不仅指定了两个 FBO 从/到 blit,而是为帧缓冲区创建了两个上下文绑定点。 glBlitFramebuffer 命令从当前绑定的READ_FRAMEBUFFER 到当前绑定的DRAW_FRAMEBUFFER

如果您不使用 blit,那么您实际上并不需要 DRAW/READ 区别。这并不意味着您不应该使用它。 glReadPixels 读取自 READ_FRAMEBUFFER。绑定到GL_FRAMEBUFFER 绑定到两个点,因此您的代码仍然可以工作。但有时有一个可以读取且不会干扰绘图操作的 FBO 绑定很有用。

【讨论】:

【参考方案2】:

如果您指的是 GL_READ_FRAMEBUFFERGL_DRAW_FRAMEBUFFER 常量,它们来自 EXT_framebuffer_blit 扩展,后来在 OpenGL 3.0 中成为核心,并成为一个特殊的 ARB_framebuffer_object 扩展(连同 EXT_framebuffer_multisample 和原始EXT_framebuffer_object,当然)版本

它们允许您绑定单独的 FBO 以进行读取和绘图操作。这对于 EXT_framebuffer_blit 引入的 FBO 到 FBO 复制操作(允许您将数据直接从一个 FBO 复制到另一个)以及解决 EXT_framebuffer_multisample 引入(和需要)的多采样 FBO 尤其有用,这实际上构建在上述 blit 扩展之上。将 FBO 绑定到 GL_FRAMEBUFFER 时,实际上是将其绑定到 GL_READ_FRAMEBUFFERGL_DRAW_FRAMEBUFFER

就像所说的,所有这些 FBO 扩展都是 OpenGL 3.0 中的核心,但也可能适用于早期版本。更多信息请查看here。

【讨论】:

以上是关于GL_DRAW/READ_FRAMEBUFFER 与 GL_FRAMEBUFFER?的主要内容,如果未能解决你的问题,请参考以下文章