Usando QPainter sobre OpenGL no QGLWidget ao usar sombreadores

Muitos de vocês usuários do Qt (4.6 especificamente) estarão familiarizados com o exemplo Overpainting fornecido nos tutoriais do OpenGL. Estou tentando fazer algo muito semelhante, mas usando shaders para os dados puros do OpenGL, em vez do antigo pipeline de função fixa.

//  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();

Estou construindo um aplicativo de ativos 3D, portanto, o material da grade. Para tornar realmente óbvio quando funciona, um grande retângulo vermelho deve aparecer no canto superior esquerdo do widget - mas não aparece.

O 3D funciona bem, mas o QPainter não recebe nada na tela. A única diferença real que posso ver entre a minha e a documentação é que todos os cálculos da matriz de projeção e transformação são ocultos em outras funções e depois carregados no shader via glUniform. Presumivelmente, como o QPainter divide os recursos 2D em triângulos, isso significa que os shaders do QPainter não têm acesso às minhas matrizes de projeção / transformação, para que meu triângulo vermelho comece a ser desenhado - mas talvez em algum lugar fora da tela.

questionAnswers(2)

yourAnswerToTheQuestion