我添加了glEnable(GL_DEPTH_TEST); 在顶部和glDisable(GL_DEPTH_TEST); 在OpenGL和QPainter的东西之间-和ikes,它起作用了! 谢谢你…

Qt & OpenGL - QGLWidget & QPainter: depth buffering

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

没有覆盖层时,深度缓冲效果很好。 如果覆盖层被绘制,我的深度缓冲区将变为AWOL:我可以看到应该被前面的对象隐藏的东西。

initializeGL看起来像这样:

1
2
3
4
qglClearColor(Qt::black);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

我的paintEvent代码的结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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将其混合。


为什么不根据需要仅启用和禁用深度测试? 您无需"初始化" OpenGL,它是一种状态机。 这些"初始化"语句属于您的图形代码,属于需要它们的上下文中。