【问题标题】:Multisampled framebuffer only visible with Nvidia cards, not AMD or Intel HD Graphics多重采样帧缓冲区仅适用于 Nvidia 卡,而不是 AMD 或 Intel HD Graphics
【发布时间】:2021-08-14 17:15:05
【问题描述】:

该程序仅使用 Nvidia 显卡渲染帧缓冲区。我用 AMD 和 Intel 测试过相同的版本,它显示为黑色。

我创建了帧缓冲区:

enum FBOIDS
{
    FBO,
    FBO_MS,
    TEXTURE,
    TEXTURE_MS,
    RBO,
    RBO_MS
};
unsigned int ID[6];

glGenFramebuffers(1, &ID[FBO_MS]);
glBindFramebuffer(GL_FRAMEBUFFER, ID[FBO_MS]);

// generate texture
glGenTextures(1, &ID[TEXTURE_MS]);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, ID[TEXTURE_MS]);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, smaa, GL_RGBA, 1, 1, GL_TRUE);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);

// attach it to currently bound framebuffer object
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, ID[TEXTURE_MS], 0);

glGenRenderbuffers(1, &ID[RBO_MS]);
glBindRenderbuffer(GL_RENDERBUFFER, ID[RBO_MS]);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, smaa, GL_DEPTH24_STENCIL8, 1, 1);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, ID[RBO_MS]);

//========================================================================

glGenFramebuffers(1, &ID[FBO]);
glBindFramebuffer(GL_FRAMEBUFFER, ID[FBO]);

// generate texture
glGenTextures(1, &ID[TEXTURE]);
glBindTexture(GL_TEXTURE_2D, ID[TEXTURE]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ID[TEXTURE], 0);

glGenRenderbuffers(1, &ID[RBO]);
glBindRenderbuffer(GL_RENDERBUFFER, ID[RBO]);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 1, 1);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, ID[RBO]);

我是这样画的:

// =========================================
//=== Update tex
glBindFramebuffer(GL_FRAMEBUFFER, ID[FBO_MS]);

glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, ID[TEXTURE_MS]);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, smaa, GL_RGB8, size.x, size.y, GL_TRUE);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);

// attach it to currently bound framebuffer object
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, ID[TEXTURE_MS], 0);

glBindRenderbuffer(GL_RENDERBUFFER, ID[RBO_MS]);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, smaa, GL_DEPTH24_STENCIL8, size.x, size.y);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, ID[RBO_MS]);

//========================================================================

glBindFramebuffer(GL_FRAMEBUFFER, ID[FBO]);

// generate texture
glBindTexture(GL_TEXTURE_2D, ID[TEXTURE]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, size.x, size.y, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ID[TEXTURE], 0);

glBindRenderbuffer(GL_RENDERBUFFER, ID[RBO]);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, size.x, size.y);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, ID[RBO]);

glBindFramebuffer(GL_FRAMEBUFFER, ID[FBO_MS]);

glBindFramebuffer(GL_READ_FRAMEBUFFER, ID[FBO_MS]);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, ID[FBO]);
glBlitFramebuffer(0, 0, size.x, size.y, 0, 0, size.x, size.y, GL_COLOR_BUFFER_BIT, GL_NEAREST);

glBindFramebuffer(GL_FRAMEBUFFER, 0);

Github 问题的图片链接:https://github.com/christt105/Elit3D/issues/40

Program on AMD or Intel HD Graphics Program on Nvidia

【问题讨论】:

  • GL_RGB 不是颜色缓冲区所需的图像格式。 (见Required formats)。请改用GL_RGBA
  • 问题可能与深度缓冲区的格式有关。试试GL_DEPTH32_STENCIL8 (AMD)
  • 问题已解决。问题是我设置了更多 GPU 可以承受的样本。我使用glGetIntegerv(GL_MAX_SAMPLES, &maxSamples); 来获取最大样本数。非常感谢您的回答和时间!
  • 请自行回答问题。您的最后一条评论就是答案。只需将其复制到答案即可。

标签: c++ opengl graphics framebuffer


【解决方案1】:

问题已解决。问题是我设置了更多 GPU 可以承受的样本。我使用glGetIntegerv(GL_MAX_SAMPLES, &maxSamples); 来获取最大样本数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多