framebuffer 存储哪些状态?

Which states does framebuffer store?

我创建了一个屏幕外帧缓冲区并向其添加了两个渲染目标。

每个渲染目标都有自己的混合模式。我设置为 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

帧缓冲区是否存储这些状态中的任何一个?另外我想知道其他州,如果你愿意分享。

我知道 VAO 对象存储了一些关于顶点属性的状态,所以我想也许 framebuffer 也存储了一些与其附件相关的状态

编辑:我更新了 glBlendFunci 参数以使用绘制索引,我使用了 bufferId/objectId

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

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

值得注意的是,没有 glNamedFramebufferBlendFunc 调用。或 *DepthMask。事实上,none 你提到的状态是帧缓冲区的一部分。

I know VAO object stores some states about vertex attributes so I thought that maybe framebuffer also stores some states which related to its attachments

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

看,当您调用 glBlendFunci 时,您传递了一个索引。这会为特定索引设置混合模式。如果传递零,则修改 blending mode for index 0. That index matches the FS output location 0.

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

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