帧缓冲区存储哪些状态?
Posted
技术标签:
【中文标题】帧缓冲区存储哪些状态?【英文标题】:Which states does framebuffer store? 【发布时间】:2018-02-07 15:44:20 【问题描述】:我创建了一个离屏帧缓冲区并向其中添加了两个渲染目标。
每个渲染目标都有自己的混合模式。我设置为glBlendFunci
:
glBlendFunci(accum->buffId, GL_ONE, GL_ONE);
glBlendFunci(revealage->buffId, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
帧缓冲区是否存储这种混合模式?因为它特定于缓冲区。我应该在每一帧中设置它还是只在初始化代码中设置它?
屏幕外帧缓冲区也不会写入深度,所以我通过glDepthMask(GL_FALSE);
禁用了它,但它似乎是全局状态而不是帧缓冲区状态。
我不知道帧缓冲区存储了多少或哪些状态。特别是我想知道关于帧缓冲区附件的这些状态:
-
glBlendFunci
glBlendFunc
glEnable(GL_BLEND)
glEnable(GL_DEPTH_TEST)
glDepthMask
帧缓冲区是否存储任何这些状态?如果您愿意分享,我也想知道其他州。
我知道 VAO 对象存储了一些关于顶点属性的状态,所以我想也许帧缓冲区也存储了一些与其附件相关的状态
编辑:我更新了 glBlendFunci 参数以使用绘制索引,我使用的是 bufferId/objectId
glBlendFunci(accum->drawIndex, GL_ONE, GL_ONE);
glBlendFunci(revealage->drawIndex, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
【问题讨论】:
【参考方案1】:了解帧缓冲区对象处理什么状态的最佳方法是查看基于 OpenGL 4.5 DSA 的 API。 glNamedFramebuffer*
形式的任何函数都会影响帧缓冲区对象。而如果没有那个形式的函数,那么它后面的状态就不会影响framebuffer的状态。因此,等效的非 DSA 形式也不会影响帧缓冲区的状态。
值得注意的是,没有glNamedFramebufferBlendFunc
电话。或*DepthMask
。实际上,您提到的所有状态都不是帧缓冲区的一部分。
我知道 VAO 对象存储了一些关于顶点属性的状态,所以我想也许帧缓冲区也存储了一些与其附件相关的状态
但就是这样;这些东西与帧缓冲区的 附件 无关。这有点复杂。
看,当你调用glBlendFunci
时,你传递了一个索引。这将为特定索引设置混合模式。如果传递零,则修改blending mode for index 0。该索引与FS output location 0 匹配。
但索引 0 不是 GL_COLOR_ATTACHMENT0
。它是draw buffer index 0。根据您在调用 glNamedFramebufferDrawBuffers
时指定的内容,绘制缓冲区索引 0 可以引用 GL_COLOR_ATTACHMENT2
。
由于这些索引不直接指定帧缓冲区附件,因此声称设置混合状态直接影响帧缓冲区附件是不正确的。
【讨论】:
感谢您的澄清,显然我误用了glBlendFunci
,在添加了颜色附件后,我正在设置 glDrawBuffers 并使索引相同,但这并不意味着我正确使用了它,谢谢。但我现在有点困惑,framebuffer 是否保持glBlendFunci
状态?如果 state 没有用glNamed**
设置,这意味着它在全局上下文中,对吗?
@recp:正如我所说,“确实,您提到的状态都不是帧缓冲区的一部分。”另外,“如果未设置状态使用 glNamed* 意味着它在全局上下文中对吗?*”不,这不是我的意思。我的意思是,如果没有 DSA 函数在帧缓冲区上设置它,那么 equivalent 非 DSA 函数不会设置帧缓冲区状态。
我将纹理 objectId 传递给 glBlendFunci
可能这让我感到困惑,我想既然我正在传递 objectId,我希望 framebuff 必须记住这个状态。通过索引使事情变得清晰。我编辑了问题以上是关于帧缓冲区存储哪些状态?的主要内容,如果未能解决你的问题,请参考以下文章