OpenGL多个渲染目标和多重采样

时间:2015-04-10 16:29:10

标签: c++ opengl multisampling deferred-rendering msaa

在OpenGL中使用多个渲染目标时,我遇到使用显式多重采样的问题。

我有4个渲染目标(位置,漫反射+不透明度,法线,高光+指数),这些渲染目标在初始几何体传递期间渲染。

这些都是附加到帧缓冲对象的非多重采样纹理,然后使用glDrawBuffers()设置为渲染目标。这很好用,然后我可以稍后对这些纹理进行采样,以获得照明计算所需的信息。可爱。

Without multisampled textures. MRT works fine.

我现在想尝试删除我得到的一些别名,所以我开始使用多重采样纹理实现显式MSAA。但是,当我使用多重采样纹理作为渲染目标时,似乎只会绘制第一个渲染目标,其余的仍为空白。

With multisampled textures. Only rendered to the first drawbuffer.

除了更改纹理在着色器中的设置,绑定和读取方式之外,我还没有改变任何其他代码。

使用以下代码将多重采样纹理附加到帧缓冲对象:

for (unsigned int i = 0; i < textureCount; ++i)
{
    // Generate texture
    GLuint texture;
    glGenTextures(1, &texture);    

    // Bind multisample texture
    glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
    glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, msaaSamples, GL_RGBA, width, height, false);

    // Set params
    glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    // Attach to frame buffer
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D_MULTISAMPLE, texture, 0);

    // Unbind
    glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
}

还附加了多重采样深度/模板纹理。

glGenTextures(1, &depth);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, depth);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, msaaSamples, GL_DEPTH24_STENCIL8, width, height, false);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, depth, 0);

然后绑定帧缓冲区并绘制缓冲区

glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLuint attachments[4] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
glDrawBuffers(4,  attachments);
然后我像往常一样绘制几何体。然而,当用apitrace检查时,很明显只有第一个颜色附件被吸入。当我使用常规(非多重采样纹理)时,情况并非如此。

然而,所有4个绘制缓冲区仍被设置。

4 draw buffers set.

1 个答案:

答案 0 :(得分:0)

glTexParameterf不能与GL_TEXTURE_2D_MULTISAMPLE一起使用。

除此之外,我会将glTexImage2DMultisample的&#39; fixedsamplelocations&#39; -param设置为true,以保证安全方面的硬件兼容性。

我建议使用像GL_RGBA8这样大小的格式而不是GL_RGBA(不知道你是如何设法获得GL_RGBA32F所列的第一张图片中带有未标注的GL_RGBA枚举......)。