当调用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++类中。
发布于 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()函数。
https://stackoverflow.com/questions/33594938
复制相似问题