1

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

我有 4 个渲染目标(位置、漫反射 + 不透明度、法线、镜面反射 + 指数),它们在初始几何传递期间被渲染。

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

没有多重采样纹理。 捷运工作正常。

我现在想尝试消除一些我得到的锯齿,所以我开始使用多重采样纹理来实现显式 MSAA。然而,当我使用多重采样纹理作为渲染目标时,似乎只有第一个渲染目标被绘制到,其余的保持空白。

具有多重采样纹理。 仅渲染到第一个绘制缓冲区。

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

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

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 个绘制缓冲区集。

4

1 回答 1

0

glTexParameterf 不能与 GL_TEXTURE_2D_MULTISAMPLE 一起使用。

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

而且我建议使用像 GL_RGBA8 这样的大小格式而不是 GL_RGBA (不知道您如何设法获得第一张图像中列出的 GL_RGBA32F 以及未调整大小的 GL_RGBA 枚举......)。

于 2015-10-11T16:07:43.210 回答