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);
禁用了它,但它似乎是全局状态而不是帧缓冲区状态。
我不知道帧缓冲区存储了多少或哪些状态。特别是我想知道这些关于帧缓冲区附件的状态:
- glBlendFunci
- glBlendFunc
- glEnable(GL_BLEND)
- glEnable(GL_DEPTH_TEST)
- 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
.
因为这些索引不直接指定帧缓冲区附件,所以声称设置混合状态直接影响帧缓冲区附件是不正确的。
我创建了一个屏幕外帧缓冲区并向其添加了两个渲染目标。
每个渲染目标都有自己的混合模式。我设置为 glBlendFunci
:
glBlendFunci(accum->buffId, GL_ONE, GL_ONE);
glBlendFunci(revealage->buffId, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
framebuffer 是否存储这种混合模式?因为它是特定于一个缓冲区的。我应该在每一帧中设置它还是只在初始化代码中设置它?
此外,屏幕外帧缓冲区不会写入深度,所以我通过 glDepthMask(GL_FALSE);
禁用了它,但它似乎是全局状态而不是帧缓冲区状态。
我不知道帧缓冲区存储了多少或哪些状态。特别是我想知道这些关于帧缓冲区附件的状态:
- glBlendFunci
- glBlendFunc
- glEnable(GL_BLEND)
- glEnable(GL_DEPTH_TEST)
- 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
.
因为这些索引不直接指定帧缓冲区附件,所以声称设置混合状态直接影响帧缓冲区附件是不正确的。