我升级了我的FBO代码,以使用OpenGL 4.5中的DSA(直接访问状态)功能。
一切都很好,但我仍然需要在绘制之前使用 glBindFramebuffer()。我错过了什么吗?
在吸引我的FBO之前,我正在考虑这个电话。
glNamedFramebufferDrawBuffer(m_FBO, GL_COLOR_ATTACHMENT0);
然后使用这个恢复到默认帧缓冲区。
glDrawBuffer(GL_BACK);
但它不起作用。我是否仍然应该使用 glBindFramebuffer() ?最后,如果是这样,glNamedFramebufferDrawBuffer()有什么用?
我几乎没有找到关于这个的明确话题。
glNamedFramebufferDrawBuffer
不会将 frambuffer 绑定到目标。它仅指定命名帧缓冲对象的颜色缓冲区。
请参阅 OpenGL 4.6 核心配置文件规范 - 17.4.1 选择用于写入的缓冲区,第 513 页:
17.4.1 选择要写入的缓冲区
第一个此类操作是控制写入每个片段颜色值的颜色缓冲区。这是通过下面描述的 DrawBuffer或DrawBuffers命令完成的。 写入片段颜色零的帧缓冲区对象的缓冲区集由命令控制
void DrawBuffer( enum buf ); void NamedFramebufferDrawBuffer( uint framebuffer, enum buf );
对于DrawBuffer,帧缓冲区对象是绑定到DRAW_FRAMEBUFFER绑定的对象。对于NamedFramebufferDrawBuffer,framebuffer为零或帧缓冲区对象的名称。如果帧缓冲为零,则默认绘制帧缓冲会受到影响。
请参阅 OpenGL 4.6 核心配置文件规范 - 9.2 绑定和管理帧缓冲对象,第 297 页:
帧缓冲区对象是通过将GenFramebuffers返回的名称(见下文)绑定到DRAW_FRAMEBUFFER或READ_FRAMEBUFFER来创建的。绑定通过调用
void BindFramebuffer( enum target, uint framebuffer );
,目标设置为所需的帧缓冲目标,帧缓冲设置为帧缓冲对象名称。生成的帧缓冲对象是一个新的状态向量...