2011-07-15 81 views
5

我繼承了QGLWidget,並在paintEvent中繪製代碼,而不是paintGL,因爲我想用QPainter繪製2D覆蓋圖,並使用OpenGL完成3D模型。Qt&OpenGL - QGLWidget&QPainter:深度緩衝

當我沒有覆蓋層時,我的深度緩衝工作正常。如果疊加層被繪製,我的深度緩衝區變爲AWOL:我可以看到應該被前面的對象隱藏的東西。

initializeGL看起來是這樣的:

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

取決於如果在同一場景看起來好嗎(覆蓋關閉)或錯誤(覆蓋)。除了奇怪的深度緩衝區問題之外,它工作得非常好。

我的(瘋狂)猜測是QPainter的構造禁用深度緩衝。任何提示將不勝感激。我想一個後備解決方案將渲染我的覆蓋到一個紋理,並讓OpenGL融入其中。

回答

5

爲什麼不只是根據需要啓用和禁用深度測試?你不「初始化」OpenGL,它是一個狀態機。這些「初始化」語句屬於您的繪圖代碼,涉及它們所需的環境。

+0

我加了glEnable(GL_DEPTH_TEST);頂部和glDisable(GL_DEPTH_TEST); OpenGL和QPainter之間的東西 - 和yike,它的工作原理!謝謝一堆。 – user816098