2011-07-15 80 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