【问题标题】:OpenGL multiple render targets and multisamplingOpenGL 多渲染目标和多重采样
【发布时间】:2015-06-16 11:07:19
【问题描述】:

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

我有 4 个渲染目标(Position、Diffuse + opacity、Normal、Specular + exponent)在初始几何体传递期间被渲染。

这些都是附加到帧缓冲区对象的非多重采样纹理,然后使用 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 个绘制缓冲区肯定仍在设置中。

【问题讨论】:

  • 请贴出相关部分代码。没有它就不可能提供帮助。
  • 添加了可能相关的代码,以及 2 张图片以突出问题。
  • 你也有多重采样深度/模板附件吗?
  • 同样值得怀疑的是GLuint attachments[2] = { GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3, GL_COLOR_ATTACHMENT4 }这一行。它应该是数组大小 4,而不是 2,附件计数也应该从 0 开始。
  • 如果将“attachments[2]”更改为“attachments[4]”并不能解决问题,那么在绑定帧缓冲区后调用 glCheckFramebufferStatus 可能有助于诊断问题。

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


【解决方案1】:

glTexParameterf 不能与 GL_TEXTURE_2D_MULTISAMPLE 一起使用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多