【问题标题】:OpenGL DSA and FBOOpenGL DSA 和 FBO
【发布时间】:2018-01-07 18:04:16
【问题描述】:

我升级了我的 FBO 代码以使用来自 OpenGL 4.5 的 DSA(直接访问状态)功能。

一切都很好,但我仍然需要在绘制之前使用 glBindFramebuffer()。有什么我错过的吗?

在绘制到我的 FBO 之前,我正在考虑这个电话。

glNamedFramebufferDrawBuffer(m_FBO, GL_COLOR_ATTACHMENT0);

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

glDrawBuffer(GL_BACK);

但它不起作用。我还应该使用 glBindFramebuffer() 吗?最后,如果是这样,那么 glNamedFramebufferDrawBuffer() 有什么用?

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

【问题讨论】:

    标签: framebuffer opengl-4


    【解决方案1】:

    glNamedFramebufferDrawBuffer 不会将帧缓冲区绑定到目标。它只为命名的帧缓冲区对象指定颜色缓冲区。

    OpenGL 4.6 core profile specification - 17.4.1 Selecting Buffers for Writing, p. 513:

    17.4.1 选择写入缓冲区

    第一个这样的操作是控制每个片段颜色值写入的颜色缓冲区。这可以通过下面描述的 DrawBufferDrawBuffers 命令来完成。 片段颜色零写入的帧缓冲区对象的缓冲区集由命令控制

    void DrawBuffer( enum buf );
    void NamedFramebufferDrawBuffer( uint framebuffer, enum buf );
    

    对于 DrawBuffer,帧缓冲区对象是绑定到 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 );
    

    目标设置为所需的帧缓冲区目标,帧缓冲区设置为帧缓冲区对象名称。生成的帧缓冲区对象是一个新的状态向量 ...

    【讨论】:

    • 所以,如果我真的理解 glNamedFramebufferDrawBuffer() 的用途。对于具有多个颜色缓冲区的 FBO,我可以选择实际写入颜色的颜色缓冲区?
    • @SébastienBémelmans 是的,并且帧缓冲区不必绑定,因为您命名它,与glDrawBuffer 相比,它会影响当前绑定的帧缓冲区。
    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多