使用DSA渲染颜色附件

时间:2015-02-26 09:21:49

标签: opengl

我想用DSA渲染到帧缓冲区。但是我只在手动绑定帧缓冲区时才能使用它。有没有办法没有绑定它?

这就是我认为它会起作用的方式:

glNamedFramebufferDrawBuffer(m_fbo, GL_COLOR_ATTACHMENT0);
drawCall();

这仅在我之前使用glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);时有效。我该如何正确地做到这一点?

此外,对于使用DSA的帧缓冲器,相当于glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);的是什么?同样,我只能清除我之前是否绑定了帧缓冲区。

1 个答案:

答案 0 :(得分:2)

绘制缓冲区数组不是全局状态,而是存储在每帧缓冲区中。您可能熟悉顶点数组对象的机制,它们维护单独的顶点属性指针集;在这种情况下,绘制缓冲区类似于属性指针。

当您调用glNamedFramebufferDrawBuffer (m_fbo, ...)时,您正在修改m_fbo数组的状态,而无需先绑定m_fbo。你实际上并没有告诉OpenGL从m_fbo的{​​{1}}中获取颜色缓冲区 - 只有当你绑定GL_COLOR_ATTACHMENT0时才会发生。

事实上,如果你批判性地考虑这个问题,这是它可以运作的唯一合乎逻辑的方式。如果您可以从不同的帧缓冲区对象中任意地获取缓冲区,那么这将违反验证(完整性)。例如,FBO0可能具有4个样本的多采样颜色附件,FBO1可能具有单采样深度附件。这是两个不兼容的缓冲区,但唯一有效的时间是当您尝试将这两个图像附加到同一个FBO时。