Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

How to enable depth testing in QOpenGLFrameBufferObject



  • I want to render the scene to a texture and the QOpenGLFrameBufferObject was used, but the depth testing was not work in the rendered texture, even if I bind the a depth render buffer to the FBO. It is all right if I render the scene to the screen.

    #include "fbowidget.h"

    FBOWidget::FBOWidget(QWidget *parent): QOpenGLWidget(parent), QOpenGLFunctions_3_3_Core()
    {

    }

    void FBOWidget::initializeGL(){
    initializeOpenGLFunctions();

    vertex.create();
    GLfloat v[] = {
        0,0,-0.5,
        0,0.5,-0.5,
        -0.5,0,-0.5,
        0,0,-1,
        0,1,-1,
        -1,0,-1,
    };
    vertex.bind();
    vertex.allocate(v, 18 * sizeof(GLfloat));
    
    this->program = new QOpenGLShaderProgram();
    this->program->addShaderFromSourceFile(QOpenGLShader::Vertex, "v.glsl");
    this->program->addShaderFromSourceFile(QOpenGLShader::Fragment, "f.glsl");
    this->program->link();
    this->program->bind();
    this->vertexLocation = this->program->attributeLocation("aPosition");
    
    rectVertex.create();
    GLfloat rect[] = {
        -0.5, 0.5, -1,
        -0.5, -0.5, -1,
        0.5, -0.5, -1,
        -0.5, 0.5, -1,
        0.5, -0.5, -1,
        0.5, 0.5, -1
    };
    rectVertex.bind();
    rectVertex.allocate(rect, 18 * sizeof(GLfloat));
    
    this->rectProgram = new QOpenGLShaderProgram();
    this->rectProgram->addShaderFromSourceFile(QOpenGLShader::Vertex, "vertex.glsl");
    this->rectProgram->addShaderFromSourceFile(QOpenGLShader::Fragment, "fragment.glsl");
    this->rectProgram->link();
    this->rectProgram->bind();
    
    this->rectVertexLocation = this->rectProgram->attributeLocation("aPosition");
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    this->fbo = new QOpenGLFramebufferObject(901,571);
    
    glGenRenderbuffers(1, &this->depthTextureId);
    glBindRenderbuffer(GL_RENDERBUFFER, this->depthTextureId);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 901, 571);
    this->fbo->bind();
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthTextureId);
    

    }

    void FBOWidget::resizeGL(int w, int h){
    this->glViewport(0,0,w,h);
    }

    void FBOWidget::paintGL(){
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glClearColor(1.0f,1.0f,0.0f,1.0f);
    this->program->bind();
    this->fbo->setAttachment(QOpenGLFramebufferObject::Depth);
    this->fbo->setAttachment(QOpenGLFramebufferObject::NoAttachment);
    this->fbo->bind();
    glEnable(GL_DEPTH_TEST);
    vertex.bind();
    this->program->setAttributeBuffer(this->vertexLocation, GL_FLOAT, 0, 3, 0);
    this->program->enableAttributeArray(this->vertexLocation);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    glDisableVertexAttribArray(this->vertexLocation);
    this->fbo->bindDefault();

    glBindTexture(GL_TEXTURE_2D, this->fbo->texture());
    this->fbo->toImage().save("hello.jpg");
    this->rectProgram->bind();
    
    rectVertex.bind();
    this->rectProgram->setAttributeBuffer(this->rectVertexLocation, GL_FLOAT, 0, 3, 0);
    this->rectProgram->enableAttributeArray(this->rectVertexLocation);
    
    glDrawArrays(GL_TRIANGLES, 0, 6);
    glDisableVertexAttribArray(this->rectVertexLocation);
    

    }


Log in to reply