我想用DSA渲染到帧缓冲区。但是我只在手动绑定帧缓冲区时才能使用它。有没有办法没有绑定它?
这就是我认为它会起作用的方式:
glNamedFramebufferDrawBuffer(m_fbo, GL_COLOR_ATTACHMENT0);
drawCall();
这仅在我之前使用glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
时有效。我该如何正确地做到这一点?
此外,对于使用DSA的帧缓冲器,相当于glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
的是什么?同样,我只能清除我之前是否绑定了帧缓冲区。
答案 0 :(得分:2)
绘制缓冲区数组不是全局状态,而是存储在每帧缓冲区中。您可能熟悉顶点数组对象的机制,它们维护单独的顶点属性指针集;在这种情况下,绘制缓冲区类似于属性指针。
当您调用glNamedFramebufferDrawBuffer (m_fbo, ...)
时,您正在修改m_fbo
数组的状态,而无需先绑定m_fbo
。你实际上并没有告诉OpenGL从m_fbo
的{{1}}中获取颜色缓冲区 - 只有当你绑定GL_COLOR_ATTACHMENT0
时才会发生。
事实上,如果你批判性地考虑这个问题,这是它可以运作的唯一合乎逻辑的方式。如果您可以从不同的帧缓冲区对象中任意地获取缓冲区,那么这将违反验证(完整性)。例如,FBO0可能具有4个样本的多采样颜色附件,FBO1可能具有单采样深度附件。这是两个不兼容的缓冲区,但唯一有效的时间是当您尝试将这两个图像附加到同一个FBO时。