rec*_*ecp 1 opengl framebuffer
我创建了一个离屏帧缓冲区,并为其添加了两个渲染目标.
每个渲染目标都有自己的混合模式.我设置它glBlendFunci:
glBlendFunci(accum->buffId, GL_ONE, GL_ONE);
glBlendFunci(revealage->buffId, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
Run Code Online (Sandbox Code Playgroud)
framebuffer是否存储此混合模式?因为它特定于缓冲区.我应该在每一帧或仅在初始化代码中设置它吗?
屏幕外的帧缓冲也不会写入深度,所以我禁用了它,glDepthMask(GL_FALSE);但它似乎是全局状态而不是帧缓冲状态.
我不知道帧缓冲存储有多少或哪些状态.特别是我想知道关于帧缓冲附件的这些状态:
帧缓冲存储这些状态中的任何一种吗?如果您想分享,我也想知道其他州.
我知道VAO对象存储了一些关于顶点属性的状态,所以我认为framebuffer也可能存储一些与其附件有关的状态
编辑:我更新了glBlendFunci参数以使用绘制索引,我使用了bufferId/objectId
glBlendFunci(accum->drawIndex, GL_ONE, GL_ONE);
glBlendFunci(revealage->drawIndex, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
Run Code Online (Sandbox Code Playgroud)
了解状态帧缓冲对象处理的最佳方法是查看基于OpenGL 4.5 DSA的API.表单的任何函数都会glNamedFramebuffer*影响帧缓冲对象.如果没有该形式的功能,那么它背后的状态不会影响帧缓冲状态.因此,等效的非DSA形式也不会影响帧缓冲的状态.
值得注意的是,没有glNamedFramebufferBlendFunc电话.或者*DepthMask.实际上,你提到的任何州都不是帧缓冲的一部分.
我知道VAO对象存储了一些关于顶点属性的状态,所以我认为framebuffer也可能存储一些与其附件有关的状态
但事实就是如此; 这些东西与帧缓冲的附件无关.这有点复杂.
在您通话时glBlendFunci,请参阅传递索引.这将设置特定索引的混合模式.如果传递零,则修改索引0的混合模式.该索引与FS输出位置0匹配.
但索引0 不是 GL_COLOR_ATTACHMENT0.它是绘制缓冲区索引0.根据您调用时指定的内容glNamedFramebufferDrawBuffers,绘制缓冲区索引0可以参考GL_COLOR_ATTACHMENT2.
因为这些索引不是直接特定的帧缓冲附件,所以声称设置混合状态直接影响帧缓冲附件是不正确的.