使用 DSA 渲染到颜色附件

render to color attachment with DSA

我想使用 DSA 渲染到帧缓冲区中。但是,我只是在手动绑定帧缓冲区时才让它工作。有没有办法不绑定呢?

这就是我认为的工作方式:

glNamedFramebufferDrawBuffer(m_fbo, GL_COLOR_ATTACHMENT0);
drawCall();

这只有在我之前使用 glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); 时才有效。我该如何正确操作?

此外,对于带 DSA 的帧缓冲区,glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 的等效项是什么?同样,如果我之前绑定了帧缓冲区,我只能清除。

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

当您调用 glNamedFramebufferDrawBuffer (m_fbo, ...) 时,您正在修改 m_fbo 数组的状态,而无需先绑定 m_fbo。您实际上并没有告诉 OpenGL 从 m_fboGL_COLOR_ATTACHMENT0 获取其颜色缓冲区 - 只有当您绑定 m_fbo.

时才会发生

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