致电glBindFramebuffer(GLenum target, GLuint framebuffer);
时,我知道target
可以是GL_READ_FRAMEBUFFER
,GL_DRAW_FRAMEBUFFER
或GL_FRAMEBUFFER
,这两者都是。
但是,当我将纹理或Renderbuffer对象附加到帧缓冲区时,我也必须提供一个绑定目标。
我的问题是,当我通过绑定目标target
将任何内容附加到帧缓冲区时,它是否保持不变?
这意味着当渲染缓冲区通过绑定点GL_DRAW_FRAMEBUFFER
附加到帧缓冲区时,它将始终是绘制操作的目标,如果我希望渲染缓冲区从读取我必须再次致电glFramebufferRenderbuffer()
,此时target
设置为GL_READ_FRAMEBUFFER
。
任何人都可以证实吗?我问,因为我试图将所有这些封装在C ++类中。
答案 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()
功能。