首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL帧缓冲区绑定目标

OpenGL帧缓冲区绑定目标
EN

Stack Overflow用户
提问于 2015-11-08 14:17:37
回答 1查看 526关注 0票数 0

当调用glBindFramebuffer(GLenum target, GLuint framebuffer);时,我知道target可以是GL_READ_FRAMEBUFFERGL_DRAW_FRAMEBUFFERGL_FRAMEBUFFER,两者兼有。

但是,当我将纹理或Renderbuffer对象附加到框架缓冲区时,我还必须提供一个绑定目标。

我的问题是,当我通过绑定目标target将任何内容附加到框架缓冲区时,它是否保持不变?

这意味着当一个呈现缓冲区通过绑定点GL_DRAW_FRAMEBUFFER附加到一个框架缓冲区时,它将始终是绘图操作的目标,如果我希望从那时起读取该呈现缓冲区,则必须再次调用glFramebufferRenderbuffer(),并将target设置为GL_READ_FRAMEBUFFER

有人能证实这一点吗?我之所以这样问,是因为我试图将所有这些都封装在C++类中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-08 14:55:16

这意味着当一个呈现缓冲区通过绑定点GL_DRAW_FRAMEBUFFER附加到一个框架缓冲区时,它将始终是绘图操作的目标,如果我希望从那时起读取该呈现缓冲区,则必须再次调用glFramebufferRenderbuffer(),并将目标设置为GL_READ_FRAMEBUFFER。

不是的。附件是每个FBO状态,它们与绑定点FBO无关。

一个对象可能绑定到语义不同的绑定目标,但是对象本身定义了它的所有状态。例如,您可能会将数据加载到绑定为GL_PIXEL_UNPACK_BUFFER的缓冲区,然后通过将数据绑定为GL_VERTEX_ARRAY_BUFFER来使用该数据作为顶点属性。

但是,当我将纹理或Renderbuffer对象附加到框架缓冲区时,我还必须提供一个绑定目标。

这是因为传统GL使用绑定来修改语义。如果要操作任何对象的状态,则必须将其绑定到某个目标(当然,与对象类型匹配),所有状态设置函数都将通过寻址目标间接引用对象。这并不意味着修改与绑定点有任何关系。

约束修改他的原则一直是OpenGL经常被批评的原则。长期以来,为了解决这个问题,一些供应商已经实现了EXT_direct_state_access扩展。它提供函数直接引用对象,而不是间接使用绑定点。在您的示例中,glNamedFramebufferRenderbufferEXT将允许您直接附加渲染缓冲区,而无需先绑定FBO。

最后,使用OpenGL 4.5,直接状态访问被提升为OpenGL的核心特性,并且创建ARB_direct_state_access允许实现者为早期GL版本提供最终的API (在某些方面与EXT版本不同)。现在有了官方的glNamedFramebufferRenderbuffer()函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33594938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档