我创建了一个离屏帧缓冲区,并为其添加了两个渲染目标。
每个渲染目标都有自己的混合模式。我按glBlendFunci
:
glBlendFunci(accum->buffId, GL_ONE, GL_ONE);
glBlendFunci(revealage->buffId, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
framebuffer会存储这种混合模式吗?因为它特定于缓冲区。我应该在每一帧或仅在初始化代码中设置它吗?
屏幕外帧缓冲也不会写入深度,所以我通过glDepthMask(GL_FALSE);
禁用它,但它似乎是全局状态而不是帧缓冲状态。
我不知道帧缓冲存储有多少或哪些状态。特别是我想了解关于帧缓冲附件的这些状态:
framebuffer会存储这些状态吗?如果你想分享它,我想知道其他州。
我知道VAO对象存储了一些关于顶点属性的状态,所以我认为framebuffer也可能存储一些与其附件有关的状态
编辑:我更新glBlendFunci参数使用draw index,我用的是bufferId / objectIdglBlendFunci(accum->drawIndex, GL_ONE, GL_ONE);
glBlendFunci(revealage->drawIndex, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
答案 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
。
因为这些索引不是直接特定的帧缓冲附件,所以声称设置混合状态直接影响帧缓冲附件是不正确的。