我有以下渲染流程:
{0.0f,0.0f,0.0f,0.0f}
清除MSAA x8 FBO颜色附件(RGBA)我注意到的是,当我将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清除的空白结果为零:
MSAA FBO alpha清除的结果为一个:
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清除为零:
MSAA FBO已清除为一个:
即使我禁用与glDisable(G_BLEND)
的混合,我也看不到任何更改