Usar QPainter sobre OpenGL en QGLWidget cuando se usan sombreadores

Muchos de ustedes usuarios de Qt (4.6 específicamente) estarán familiarizados con el ejemplo de Overpainting suministrado en los tutoriales de OpenGL, estoy tratando de hacer algo muy similar, pero usando sombreadores para los datos puros de OpenGL, en lugar de la antigua tubería de función fija.

//  Set background and state.
makeCurrent();
qglClearColor( bgColour_ );

glEnable( GL_DEPTH_TEST );
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );

if ( smoothLines_ ) {
    glEnable( GL_BLEND );
    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
    glEnable( GL_LINE_SMOOTH );
    glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
}

//  Clear the buffers.
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glUseProgram( shader_ );

//  Draw the grid.
try {
    glLineWidth( 2.0f );
    manager_->setColour( centreColour_ );
    grid_->draw( oE_GLGrid::Centre );

    glLineWidth( 1.5f );
    manager_->setColour( majorColour_ );
    grid_->draw( oE_GLGrid::Major );

    glLineWidth( 1.0f );
    manager_->setColour( minorColour_ );
    grid_->draw( oE_GLGrid::Minor );
} catch( oE_GLException& e ) {
    cout << "OpenGL Error: " << e.what() << endl;
    return;
}

//  Reset OpenGL state for overlays.
glDisable( GL_DEPTH_TEST );
if ( smoothLines_ ) {
    glDisable( GL_BLEND );
    glDisable( GL_LINE_SMOOTH );
}

//  Draw the overlays.
QPainter p( this );
p.beginNativePainting();
p.fillRect( 10, 10, 100, 100,
        QColor( 255, 0, 0 ) );
p.endNativePainting();

Estoy construyendo una aplicación de activos 3D, de ahí las cosas de la grilla. Para que sea realmente obvio cuando funciona, debería aparecer un gran rectángulo rojo en la esquina superior izquierda del widget, pero no es así.

El 3D funciona bien, pero QPainter no consigue nada en la pantalla. La única diferencia real que puedo ver entre la mía y los documentos es que todos los cálculos de la matriz de proyección y transformación se ocultan en otras funciones y luego se cargan en el sombreador a través de glUniform. Presumiblemente, a medida que QPainter divide los activos 2D en triángulos, esto significa que los sombreadores de QPainter no tienen acceso a mis matrices de proyección / transformación, por lo que mi triángulo rojo comienza a dibujarse, pero tal vez en algún lugar fuera de la pantalla.

Respuestas a la pregunta(2)

Su respuesta a la pregunta