11

Qt(特に4.6)ユーザーの多くは、OpenGLチュートリアルで提供されているオーバーペイントの例に精通しています。私は非常に似たようなことをしようとしていますが、古い固定関数パイプラインの代わりに、純粋なOpenGLデータにシェーダーを使用しています。

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

私は3Dアセットアプリケーションを構築しているので、グリッドのものです。動作するタイミングを明確にするために、ウィジェットの左上隅に大きな赤い長方形が表示されますが、表示されません。

3Dは正常に機能しますが、QPainterは画面に何も表示しません。私とドキュメントの間で私が見ることができる唯一の本当の違いは、すべての射影と変換行列の計算が他の関数に隠されてから、glUniformを介してシェーダーにアップロードされることです。おそらく、QPainterが2Dアセットを三角形に分割するとき、これは、QPainterのシェーダーが投影/変換行列にアクセスできないことを意味します。そのため、赤い三角形が描画され始めますが、おそらく画面外のどこかにあります。

4

2 に答える 2

11

OpenGLを呼び出す前に、beginNativePainting()を呼び出します。OpenGL状態のglPush/Popも必要になる場合があります。次のようなものを試してください。

QPainter p( this );
p.beginNativePainting();

// Maybe necessary
glPushAttrib(GL_ALL_ATTRIB_BITS);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glPushMatrix();

// Put OpenGL code here

// Necessary if used glPush-es above
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glPopAttrib();

p.endNativePainting();

p.fillRect( 10, 10, 100, 100,
        QColor( 255, 0, 0 ) );
于 2010-11-30T18:47:50.013 に答える
4

この回答を投稿して、QPainterコードを呼び出す前にOpenGL頂点バッファバインディングをクリーンアップするcmannet85 (上記のbaysmithによる回答へのコメント)によって見つけられた、私が真の解決策と見なすものを強化および明確化します。

QPainter関数とOpenGL関数の使用を切り替える必要があるという点で、ほぼ同じ問題がありました。cmannet85が発見したように、1つの原因は、OpenGL関数がバインドされた頂点バッファーを残す場合、QPainterによるOpenGLの使用を妨げることです

glBindBufferを呼び出したOpenGLES2.0コードのすべての部分の最後にこのステートメントを追加することで、問題を修正することができました。

glBindBuffer(GL_ARRAY_BUFFER,0);

2番目のパラメーター0は、バッファーのバインドを解除します。

beginNativePainting...endNativePaintingへの呼び出しの追加などの他の変更は必要ありませんでした。

于 2017-11-21T16:17:48.427 に答える