Qt& OpenGL - QGLWidget& QPainter:深度缓冲

时间:2011-07-15 15:14:42

标签: qt opengl overlay qpainter qglwidget

我将QGLWidget子类化,并将我的绘画代码放在paintEvent而不是paintGL中,因为我想使用QPainter在我使用OpenGL完成的3D内容上绘制2D叠加层。

当我没有叠加时,我的深度缓冲工作正常。如果覆盖图被绘制,我的深度缓冲区就会变为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();

根据if,相同的场景看起来没问题(覆盖关闭)或错误(覆盖打开)。除了奇怪的深度缓冲问题,它的效果非常好。

我的(狂野)猜测是QPainter的构造禁用了深度缓冲。任何暗示都将非常感激。我认为后备解决方案是将我的叠加层渲染到纹理中并让OpenGL将其混合。

1 个答案:

答案 0 :(得分:5)

为什么不根据需要启用和禁用深度测试?你没有“初始化”OpenGL,它是一个状态机。这些“初始化”语句属于您的绘图代码,属于需要它们的上下文。