2011-07-15 17 views
5

QGLWidgetをサブクラス化し、paintGLの代わりにpaintEventに自分のペイントコードを持っていますので、QPainterを使用して2DオーバーレイをOpenGLで3Dペイントします。Qt&OpenGL - QGLWidget&QPainter:深度バッファリング

オーバレイがないと、深度バッファリングが正常に機能します。オーバーレイがペイントされている場合、私のデプスバッファーはAWOLになります。オブジェクトの前に隠れるべきものを見ることができます。

qglClearColor(Qt::black); 
glShadeModel(GL_FLAT); 
glEnable(GL_DEPTH_TEST); 
glEnable(GL_CULL_FACE); 

次のように私のpaintEventコードの構造は次のとおりです:

makeCurrent(); 

...openGLStuff... 

if (I need my overlay) 
{ 
    glPushAttrib(GL_ALL_ATTRIB_BITS); 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 

    QPainter painter(this); 

    ... do QPainter stuff ... 

    glPushAttrib(GL_ALL_ATTRIB_BITS); 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
} 

swapBuffers(); 

、同じシーンが大丈夫に見える場合(オフオーバーレイ)に応じて、または間違った(

initializeGLは次のようになりますオーバーレイをオンにする)。奇妙な奥行きバッファの問題とは別に、完全にうまく動作します。

私の(野生の)推測は、QPainterの構築が深度バッファリングを無効にするということです。どんなヒントも非常に高く評価されます。私は、テクスチャにオーバーレイをレンダリングし、OpenGLでそれをブレンドする代替ソリューションがあると思います。

答えて

5

必要に応じて深度テストを有効にしたり無効にしたりするのはなぜですか?あなたはOpenGLを "初期化"しません。これは状態マシンです。これらの「初期化」ステートメントは、図面コード内に必要なコンテキストに属します。

+0

glEnable(GL_DEPTH_TEST)を追加しました。一番上にあり、glDisable(GL_DEPTH_TEST); OpenGLとQPainterの間のやりとり、それはうまく動作します!本当にありがとう。 – user816098

関連する問題