OpenGL DSA和FBO

时间:2018-01-07 18:04:16

标签: framebuffer opengl-4

我将我的FBO代码升级为使用OpenGL 4.5的DSA(直接访问状态)功能。

一切都很好,但在绘图之前我还需要使用glBindFramebuffer()。有没有我错过的东西?

在接触我的FBO之前,我正在考虑这个电话。

glNamedFramebufferDrawBuffer(m_FBO, GL_COLOR_ATTACHMENT0);

然后使用这个恢复为默认帧缓冲。

glDrawBuffer(GL_BACK);

但它不起作用。我还应该使用glBindFramebuffer()吗?最后,glNamedFramebufferDrawBuffer()的用法是什么呢?

我几乎找不到明确的话题。

1 个答案:

答案 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对象是一个新的状态向量...