GL_DRAW/READ_FRAMEBUFFER vs GL_FRAMEBUFFER?

GL_DRAW/READ_FRAMEBUFFER vs GL_FRAMEBUFFER?

本文关键字:GL FRAMEBUFFER vs DRAW READ      更新时间:2023-10-16

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

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

迂腐的注释:GL_DRAW/READ_FRAMEBUFFER不是在扩展中引入的;它们是OpenGL 3.0的核心功能。是的,从技术上讲,此功能也在ARB_framebuffer_objects中公开,但这是一个核心扩展,它仍然是核心 GL 3.0。

无论如何,如果你想要DRAW/READ区别的词源,你需要寻找EXT_framebuffer_blit。这就是这些普查员的起源,也是这些普查员存在的原因。他们不仅指定了两个要从/到块传输的 FBO,还为帧缓冲区创建了两个上下文绑定点。glBlitFramebuffer 命令从当前绑定的READ_FRAMEBUFFER到当前绑定的DRAW_FRAMEBUFFER

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

如果您指的是GL_READ_FRAMEBUFFER常量和GL_DRAW_FRAMEBUFFER常量,它们来自 EXT_framebuffer_blit 扩展,该扩展后来成为 OpenGL 3.0 的核心,并成为版本 <3 的特殊ARB_framebuffer_object扩展(当然还有 EXT_framebuffer_multisample 和原始EXT_framebuffer_object(。

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

就像说的那样,所有这些FBO扩展都是OpenGL 3.0的核心,但也可能适用于早期版本。查看此处以获取更多信息。