微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 尝试创建多采样帧缓冲区

我想弄清楚如何创建一个处理多重采样的帧缓冲对象。下面是我尝试让它工作,但每当我检查我的帧缓冲区状态时,我都会收到 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,GL_RGBA,w,h,GL_UNSIGNED_BYTE,NULL);
        f->glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE,samples,GL_RGBA8,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_TEXTURE_2D_MULTISAMPLE,0);
    }

    if (_renderBufferDepthStencilID == 0)
    {
        f->glGenRenderbuffers(1,&_renderBufferDepthStencilID);
        f->glBindRenderbuffer(GL_RENDERBUFFER,_renderBufferDepthStencilID);
//        f->glrenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH24_STENCIL8,h);
        f->glrenderbufferStorageMultisample(GL_RENDERBUFFER,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);
}

解决方法

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

相反,您应该将ALL目标更改为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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。