Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Game Development
  4. Frame Buffer Object not being updated when QOpenGLWidget update is called.
Qt 6.11 is out! See what's new in the release blog

Frame Buffer Object not being updated when QOpenGLWidget update is called.

Scheduled Pinned Locked Moved Unsolved Game Development
1 Posts 1 Posters 598 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R Offline
    R Offline
    Rafael Marinho
    wrote on last edited by Rafael Marinho
    #1

    I'm trying to do a off screen rendering using a native framebuffer object but the QOpenGLWidget paintGL method is interfering somehow on fbo writing. Basically, i have a main class MainGL( QOpenGLWidget), which instantiate a QMediaplayer, setting a custom surface called MyVideoWidgetSurface(QAbstractVideoSurface) as output surface.

    The basic flow is: whenever a new video frame is available at QAbstractVideoSurface::present, the related video frame texture is rendered to a off screen frame buffer and later grabbed as a new QImage by glReadPixels. Later, this QImage is passed to MainGL using a signal/slot. The slot calls QOpenglWidget update method witch renders the QImage on the screen. The issue takes place exactly after QOpenglWidget::update is called for the first time, because the first framebuffer object is grabbed correctly. If i comment the 'emitting a signal' part then all offscreen rendering succeed without problem.
    What can QOpenGLWidget::paintGL is doing to has this side effect ? I have already commented out all my code in the overwritten paintGL method to ensure that is not the render to screen code sake.

    Bellow is the offscreen rendering part.

    MyVideoWidgetSurface::present(QVideoFrame frame){
    	// extract m_fbotex here
    	...
            QOpenGLContext* ctx = QOpenGLContext::currentContext();
            QOpenGLFunctions* f = ctx->functions();
    
            GLCHK(f->glGetIntegerv( GL_FRAMEBUFFER_BINDING, &prevFbo ));
            GLCHK(f->glBindFramebuffer(GL_FRAMEBUFFER, m_fbo));
            GLCHK(f->glUseProgram(programObject));
            GLCHK(f->glViewport(0, 0, texWidth, texHeight));
            GLCHK(f->glClearColor(0.0f, 0.0f, 0.0f, 0.0f));
            GLCHK(f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
    
            GLCHK(f->glVertexAttribPointer ( positionLoc, VTX_POS_SIZE, GL_FLOAT,GL_FALSE, VTX_STRIDE, (GLvoid*) offset ));
            offset += VTX_POS_SIZE * sizeof(GLfloat);
            GLCHK(f->glVertexAttribPointer ( texCoordLoc, VTX_TEX_SIZE, GL_FLOAT,GL_FALSE, VTX_STRIDE, (GLvoid*) offset ));
    
            GLCHK(f->glEnableVertexAttribArray ( positionLoc ));
            GLCHK(f->glEnableVertexAttribArray ( texCoordLoc ));
    
            GLCHK(f->glActiveTexture ( GL_TEXTURE0 ));
            GLCHK(f->glBindTexture(GL_TEXTURE_2D, m_fbotex));
    
    	// fill m_fbotex texture with dummy data, test purpose only.
            QImage dummy( currentFrame.width(), currentFrame.height(), QImage::Format_ARGB32);
            unsigned int randcolor = QRandomGenerator::global()->generate();
            dummy.fill(QColor::fromRgb(randcolor));
    
            GLCHK(f->glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,  texWidth, texHeight,0, GL_BGRA_EXT, GL_UNSIGNED_BYTE,  dummy.bits()));
            GLCHK(f->glUniform1i ( samplerLoc, 0 ));
    
            GLCHK(f->glBindTexture(GL_TEXTURE_2D, 0));
            GLCHK(f->glActiveTexture ( GL_TEXTURE0 ));
            GLCHK(f->glBindTexture(GL_TEXTURE_2D, m_fbotex));
            GLCHK(f->glDrawElements ( GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0 ));
            GLCHK(f->glReadPixels( 0, 0,  texWidth,  texHeight, GL_RGBA, GL_UNSIGNED_BYTE, imageCaptured.bits() ));
            GLCHK(f->glUseProgram(0));
            GLCHK(f->glBindTexture(GL_TEXTURE_2D, 0));
            GLCHK(f->glBindFramebuffer(GL_FRAMEBUFFER, prevFbo));
                            
            emit changed(imageCaptured); //the associated slot issue a update on MainGL (QOpenlGLWidget).
    	...
    	return true;
    			
    }
    
    

    If someone else could give a tip on what is causing this i would be thankful.
    Best Regards,
    Thanks in advance.

    1 Reply Last reply
    0

    • Login

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Get Qt Extensions
    • Unsolved