OpenGL多渲染目标和多重采样

vlurs2pr  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(161)

在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个绘制缓冲区仍在设置中。

rjzwgtxy

rjzwgtxy1#

glTexParameterf不能与GL_TEXTURE_2D_MULTISAMPLE一起使用。
除此之外,我会将glTexImage 2DMultisample的'fixedsampllocations'-param设置为true,以确保硬件兼容性。
我建议使用像GL_RGBA8这样的大小格式,而不是GL_RGBA(不知道您是如何设法获得GL_RGBA32F的,如第一张图片中列出的,其中包含未调整大小的GL_RGBA枚举...)。

相关问题