透明MSAA FBO解决期间的混叠工件

时间:2019-04-29 17:44:57

标签: c++ opengl glsl glm-math

我有以下渲染流程:

  1. 使用{0.0f,0.0f,0.0f,0.0f}清除MSAA x8 FBO颜色附件(RGBA)
  2. 发出单个绘制调用(绘制矩形)。
  3. 绑定解决FBO(仅单个RGBA颜色附件)
  4. 将MSAA FBO拆分为Resolve FBO。

我注意到的是,当我将MSAA FBO清除为全零时,AA沿对角线边缘仍然有一些混淆现象。 但是,如果我用{0.0f,0.0f,0.0f,1.0f}清除,则抗锯齿​​效果还可以。 为了验证问题是否出在Alpha通道上,我附加了颜色纹理来解析具有GL_RGB格式而不是GL_RGBA的FBO(与解析为不显示此问题的屏幕帧缓冲区相同),在这种情况下,该问题不存在出现。

所以我的问题是,当MSAA RT清除为零alpha时,为什么会发生这种情况? 除了将alpha清除为1以外,我该如何解决?为什么我需要将其清除为零?因为这是中间过程,所以其结果稍后将在alpha合成中使用。

这是代码的一些重要部分。我忽略了用于纹理和FBO设置的纯OpenGL初始化逻辑,因为它是在C ++ API之后抽象的,而C ++ API在生产中已经过了良好的测试。两个FBO都使用RGBA格式的纹理附件。

渲染循环:

 const float clearColorZero[4] = { 0.0f,0.0f,0.0f,0.0f };

 glClearNamedFramebufferfv(msaaFBO, GL_COLOR, 0, clearColorZero);
 glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO);
 glViewport(0, 0,width,height);
 //Bind shader program and mesh:
 BindProgram(mainProg);
 BindMesh(mesh);
 glProgramUniformMatrix4fv(mainProg, 0, 1, GL_FALSE,glm::value_ptr(matrixMVP)); 
 Draw(mesh);//calls glDrawArrays

 //Resolve MSAA
 glBlitNamedFramebuffer(
                msaaFBO,
                resolveFBO, 
                0, 0, width, height,
                0, 0, width, height,
                GL_COLOR_BUFFER_BIT,GL_NEAREST);

简单的片段着色器:

 #version 450 core
 out vec4 o_color;
 void main()
 {
    o_color = vec4(1.0,228.0 /255.0,123.0/255.0,1.0); 
 }

MSAA FBO alpha清除的空白结果为零:

enter image description here

MSAA FBO alpha清除的结果为一个:

enter image description here

PS:如果我在着色器中手动解析MSAA,也会发生同样的情况:

#version 450 core
#define NUM_MSAA_SAMPLES 8
layout(binding  = 0) uniform  sampler2DMS colorMap;
out vec4 o_color;
void main()
{
     vec4 color = texelFetch(colorMap,ivec2(gl_FragCoord.xy), 0);
     for(int i = 1; i < NUM_MSAA_SAMPLES; ++i)
     {
        vec4 samplePoint = texelFetch(colorMap, ivec2(gl_FragCoord.xy), i);
        color += samplePoint; 
     }
     color /= float(NUM_MSAA_SAMPLES); 
     o_color= color;
}

以下是屏幕截图的放大版本:

MSAA FBO清除为零:

enter image description here

MSAA FBO已清除为一个:

enter image description here

即使我禁用与glDisable(G_BLEND)的混合,我也看不到任何更改

0 个答案:

没有答案