帧缓冲存储哪些状态?

时间:2018-02-07 15:44:20

标签: opengl framebuffer

我创建了一个离屏帧缓冲区,并为其添加了两个渲染目标。

每个渲染目标都有自己的混合模式。我按glBlendFunci

设置了它
glBlendFunci(accum->buffId,     GL_ONE,  GL_ONE);
glBlendFunci(revealage->buffId, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);

framebuffer会存储这种混合模式吗?因为它特定于缓冲区。我应该在每一帧或仅在初始化代码中设置它吗?

屏幕外帧缓冲也不会写入深度,所以我通过glDepthMask(GL_FALSE);禁用它,但它似乎是全局状态而不是帧缓冲状态。

我不知道帧缓冲存储有多少或哪些状态。特别是我想了解关于帧缓冲附件的这些状态:

  1. glBlendFunci
  2. glBlendFunc
  3. glEnable(GL_BLEND)
  4. glEnable(GL_DEPTH_TEST)
  5. glDepthMask
  6. framebuffer会存储这些状态吗?如果你想分享它,我想知道其他州。

    我知道VAO对象存储了一些关于顶点属性的状态,所以我认为framebuffer也可能存储一些与其附件有关的状态

    编辑:我更新glBlendFunci参数使用draw index,我用的是bufferId / objectId

    glBlendFunci(accum->drawIndex,     GL_ONE,  GL_ONE);
    glBlendFunci(revealage->drawIndex, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
    

1 个答案:

答案 0 :(得分:6)

了解状态帧缓冲对象处理的最佳方法是查看基于OpenGL 4.5 DSA的API。 glNamedFramebuffer*形式的任何函数都会影响帧缓冲对象。如果没有该形式的功能,那么它背后的状态不会影响帧缓冲状态。因此,等效的非DSA形式也不会影响帧缓冲的状态。

值得注意的是,没有glNamedFramebufferBlendFunc电话。或*DepthMask。实际上,你提到的州都不是帧缓冲的一部分。

  

我知道VAO对象存储了一些关于顶点属性的状态,所以我认为framebuffer也可能存储一些与其附件有关的状态

但这就是事情;这些东西与帧缓冲区的附件无关。这有点复杂。

请注意,当您致电glBlendFunci时,您会传递一个索引。这将设置特定索引的混合模式。如果传递零,则修改blending mode for index 0。该索引与FS output location 0匹配。

但索引0 不是 GL_COLOR_ATTACHMENT0。这是draw buffer index 0。根据您在调用glNamedFramebufferDrawBuffers时指定的内容,绘制缓冲区索引0可以引用GL_COLOR_ATTACHMENT2

因为这些索引不是直接特定的帧缓冲附件,所以声称设置混合状态直接影响帧缓冲附件是不正确的。