OpenGL帧缓冲绑定目标

时间:2015-11-08 14:17:37

标签: opengl

致电glBindFramebuffer(GLenum target, GLuint framebuffer);时,我知道target可以是GL_READ_FRAMEBUFFERGL_DRAW_FRAMEBUFFERGL_FRAMEBUFFER,这两者都是。

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

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

这意味着当渲染缓冲区通过绑定点GL_DRAW_FRAMEBUFFER附加到帧缓冲区时,它将始终是绘制操作的目标,如果我希望渲染缓冲区读取我必须再次致电glFramebufferRenderbuffer(),此时target设置为GL_READ_FRAMEBUFFER

任何人都可以证实吗?我问,因为我试图将所有这些封装在C ++类中。

1 个答案:

答案 0 :(得分:1)

  

这意味着当渲染缓冲区通过绑定点GL_DRAW_FRAMEBUFFER附加到帧缓冲区时,它将始终是绘制操作的目标,如果我想从那时读取渲染缓冲区,那么我必须再次调用glFramebufferRenderbuffer()并将目标设置为这次是GL_READ_FRAMEBUFFER。

没有。附件是 per-FBO state ,它们与FBO绑定的绑定点无关。

对象可能绑定到语义上不同的绑定目标,但对象本身定义了它的所有状态。例如,您可以将数据加载到绑定为GL_PIXEL_UNPACK_BUFFER的缓冲区,稍后通过将其绑定为GL_VERTEX_ARRAY_BUFFER将此数据用作顶点属性。

  

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

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

Bind-to-modify他一直是一个经常被批评的OpenGL原则。很长一段时间,一些供应商已经实施了EXT_direct_state_access扩展,以解决这个问题。它提供了直接引用对象的函数,而不是间接使用绑定点。在您的示例中,glNamedFramebufferRenderbufferEXT将允许您直接附加渲染缓冲区而不首先绑定FBO。

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