帧缓冲区存储哪些状态?

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 必须记住这个状态。通过索引使事情变得清晰。我编辑了问题

以上是关于帧缓冲区存储哪些状态?的主要内容,如果未能解决你的问题,请参考以下文章

无法将简单的帧缓冲区渲染到四边形并显示

将负值混合到帧缓冲区 0 opengl

栈溢出 缓冲区溢出的一种 缓冲区以外的存储单元被改写 优化方法之一:尾调用

用于显示的 Linux 设备驱动程序 |帧缓冲区

如何使用 GLUT 在按键上的纹理/帧缓冲区之间切换?

帧缓冲区在 Vulkan 中究竟是啥意思