GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT尝试创建多样本帧缓冲区

Kitfox

我试图弄清楚如何创建一个处理多重采样的帧缓冲对象。下面是我尝试使其正常工作的尝试,但是每当检查帧缓冲区状态时,我都会不断收到GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT错误。即使我仅附加颜色缓冲区或仅深度/模板缓冲区,我也遇到此错误。

我已经从旧版本改编了此代码,没有进行多次采样,并且能够创建完整的帧缓冲区。我已经离开了那些旧电话,但已将其注释掉。

如何正确设置?

void DocumentPanel::setupFramebuffer()
{
    QOpenGLFunctions_3_3_Core *f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>();

    int w = width();
    int h = height();
    int samples = 16;

    if (_frameBufferID == 0)
    {
        f->glGenFramebuffers(1, &_frameBufferID);
        f->glBindFramebuffer(GL_FRAMEBUFFER, _frameBufferID);
    }

    if (_texBufferColor == 0)
    {
        // generate texture
        f->glGenTextures(1, &_texBufferColor);
        f->glBindTexture(GL_TEXTURE_2D, _texBufferColor);
        f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        f->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        f->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
//        f->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
        f->glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, w, h, false);
        f->glBindTexture(GL_TEXTURE_2D, 0);

        // attach it to currently bound framebuffer object
//        f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _texBufferColor, 0);
        f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, _texBufferColor, 0);
    }

    if (_renderBufferDepthStencilID == 0)
    {
        f->glGenRenderbuffers(1, &_renderBufferDepthStencilID);
        f->glBindRenderbuffer(GL_RENDERBUFFER, _renderBufferDepthStencilID);
//        f->glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, w, h);
        f->glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_DEPTH24_STENCIL8, w, h);
        f->glBindRenderbuffer(GL_RENDERBUFFER, 0);

        f->glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, _renderBufferDepthStencilID);
    }

    GLenum status = f->glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if (status != GL_FRAMEBUFFER_COMPLETE)
    {
        //error
        QString err;

        switch (status)
        {
        case GL_FRAMEBUFFER_UNDEFINED:
            err = "GL_FRAMEBUFFER_UNDEFINED";
        break;
        case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
            err = "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT";
        break;
        case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT :
            err = "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT ";
        break;
        case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER :
            err = "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER ";
        break;
        case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER :
            err = "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER ";
        break;
        case GL_FRAMEBUFFER_UNSUPPORTED :
            err = "GL_FRAMEBUFFER_UNSUPPORTED ";
        break;
        case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE :
            err = "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE ";
        break;
        case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS  :
            err = "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS  ";
        break;
        }

        f->glBindFramebuffer(GL_FRAMEBUFFER, 0);

        qDebug() << "Error building frambuffer: " << err;
        return;
    }

    //Rendering to window again
    f->glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
雅科夫·加尔卡(Yakov Galka)

GL_TEXTURE_2DGL_TEXTURE_2D_MULTISAMPLE是不同的纹理目标。您的代码将纹理绑定到GL_TEXTURE_2D,但随后尝试通过对其进行操作GL_TEXTURE_2D_MULTISAMPLE,该操作无效。

相反,您应该将所有目标更改GL_TEXTURE_2D_MULTISAMPLE

    f->glGenTextures(1, &_texBufferColor);
    f->glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _texBufferColor);
    f->glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGBA8, w, h, false);
    f->glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将立方体贴图纹理附加到帧缓冲区对象(FBO)时为GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

来自分类Dev

glCheckFramebufferStatus返回36054 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

来自分类Dev

附加到帧缓冲区的OpenGL多样本整数纹理无法正确解析

来自分类Dev

如何使用多样本帧缓冲区在OpenGL中选择几何?

来自分类Dev

附加到帧缓冲区的OpenGL多样本整数纹理无法正确解析

来自分类Dev

使用内部格式为GL_R16_SNORM的纹理时,GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

来自分类Dev

清除DRAW帧缓冲区仅在附加到GL_COLOR_ATTACHMENT0时才有效吗?

来自分类Dev

默认帧缓冲区的采样深度?(GL ES 3)

来自分类Dev

LibGDX帧缓冲区

来自分类Dev

尝试缓冲区溢出

来自分类Dev

尝试使用样本缓冲区作为输入来设置音频单元图

来自分类Dev

在覆盖整个帧缓冲区之前,首选glClear(GL_COLOR_BUFFER_BIT)吗?

来自分类Dev

将GL_2D_ARRAY_TEXTURE中的特定层附加到帧缓冲区

来自分类Dev

打开gl计算着色器和帧缓冲区

来自分类Dev

打开gl计算着色器和帧缓冲区

来自分类Dev

什么是深帧缓冲区?

来自分类Dev

libGDX帧缓冲区Alpha问题

来自分类Dev

什么是“哑”帧缓冲区?

来自分类Dev

OpenGL帧缓冲区+ LibGDX

来自分类Dev

复制并粘贴到帧缓冲区

来自分类Dev

处理大于缓冲区大小的帧

来自分类Dev

什么是深帧缓冲区?

来自分类Dev

深度+模板帧缓冲区问题

来自分类Dev

什么是内核帧缓冲区?

来自分类Dev

OpenGL帧缓冲区绑定目标

来自分类Dev

libGDX帧缓冲区Alpha问题

来自分类Dev

什么是“哑”帧缓冲区?

来自分类Dev

尝试进行深度附着时,帧缓冲区状态错误(返回36054)

来自分类Dev

LibGDX 如何从 FrameBuffer 获取深度缓冲区?

Related 相关文章

热门标签

归档