帧缓冲区存储哪些状态?混合模式设置时机及深度掩码疑问
关于OpenGL离屏帧缓冲区(FBO)状态的疑问解答
好问题!咱们把你的疑问拆成几个部分逐一说明:
1. glBlendFunci设置的混合模式是否会被FBO存储?
答案是会。你通过glBlendFunci为每个渲染目标(颜色附着)设置的独立混合模式,属于该FBO的附着特定状态,会被FBO对象本身存储起来。这是因为混合模式是针对每个颜色附着单独配置的,而这些附着是FBO的组成部分,所以对应的混合参数会和FBO绑定在一起。
2. 混合模式需要每帧设置还是仅初始化一次?
只需要在初始化FBO的时候设置一次就够了!当你后续绑定这个FBO进行渲染时,OpenGL会自动恢复该FBO存储的所有附着特定混合状态,不需要每次绑定都重新调用glBlendFunci。除非你后续修改了该FBO的附着配置,或者切换到其他FBO后修改了混合参数,才需要重新设置。
3. 深度掩码glDepthMask是全局状态,那FBO到底存储哪些状态?
你说得没错,glDepthMask属于OpenGL的全局上下文状态,不会被FBO存储。FBO仅存储和自身附着直接相关的状态,主要包括:
- 每个颜色附着的混合参数(通过
glBlendFunci、glBlendFuncSeparatei、glBlendEquationi等设置的模式和方程) - 每个颜色附着的颜色写入掩码(
glColorMaski控制的RGBA通道写入权限) - 帧缓冲区的附着绑定关系(哪些附着点绑定了纹理、渲染缓冲对象,以及对应的格式信息)
- 每个颜色附着的逻辑操作设置(如果启用了
GL_COLOR_LOGIC_OP,通过glLogicOp设置,但注意GL_COLOR_LOGIC_OP本身是全局开关)
而以下这些属于全局状态,和FBO无关,切换FBO时不会自动改变:
- 混合全局开关(
glEnable(GL_BLEND)) - 深度掩码、深度测试开关及参数
- 模板测试相关状态
- 视口(Viewport)、裁剪区域(Scissor)
- 当前的着色器程序、顶点数组对象等
所以如果你的离屏FBO不需要写入深度信息,你需要在绑定该FBO之后设置glDepthMask(GL_FALSE);如果之后切换回默认帧缓冲区或者其他需要深度写入的FBO,别忘了把深度掩码改回GL_TRUE,避免影响其他渲染流程。
内容的提问来源于stack exchange,提问作者recp
相关产品推荐
相关产品推荐

