我将我的FBO代码升级为使用OpenGL 4.5的DSA(直接访问状态)功能。
一切都很好,但在绘图之前我还需要使用glBindFramebuffer()。有没有我错过的东西?
在接触我的FBO之前,我正在考虑这个电话。
glNamedFramebufferDrawBuffer(m_FBO, GL_COLOR_ATTACHMENT0);
然后使用这个恢复为默认帧缓冲。
glDrawBuffer(GL_BACK);
但它不起作用。我还应该使用glBindFramebuffer()吗?最后,glNamedFramebufferDrawBuffer()的用法是什么呢?
我几乎找不到明确的话题。
答案 0 :(得分:2)
glNamedFramebufferDrawBuffer
不会将frambuffer绑定到目标。它仅为命名的帧缓冲区对象指定颜色缓冲区。
请参阅OpenGL 4.6 core profile specification - 17.4.1 Selecting Buffers for Writing, p. 513:
17.4.1选择写入缓冲区
第一个这样的操作是控制每个片段颜色值被写入的颜色缓冲区。这可以通过下面描述的 DrawBuffer 或 DrawBuffers 命令来完成。 写入片段颜色为零的帧缓冲区对象的缓冲区集由命令
控制void DrawBuffer( enum buf ); void NamedFramebufferDrawBuffer( uint framebuffer, enum buf );
对于 DrawBuffer ,framebuffer对象绑定到DRAW_FRAMEBUFFER绑定。对于 NamedFramebufferDrawBuffer ,framebuffer为零或帧缓冲对象的名称。如果framebuffer为零,则默认的绘制帧缓冲区会受到影响。
请参阅OpenGL 4.6 core profile specification - 9.2 Binding and Managing Framebuffer Objects, p. 297:
通过将 GenFramebuffers (见下文)返回的名称绑定到DRAW_FRAMEBUFFER或READ_FRAMEBUFFER来创建帧缓冲对象。通过调用
实现绑定void BindFramebuffer( enum target, uint framebuffer );
将target设置为所需的framebuffer目标,将framebuffer设置为framebuffer对象名称。生成的framebuffer对象是一个新的状态向量...