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

7

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

如果没有叠加层,则深度缓冲正常工作。 如果绘制了叠加层,则我的深度缓冲区会消失:我可以看到本应被前面对象隐藏的东西。

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混合它。

1个回答

5

为什么不根据需要启用和禁用深度测试?OpenGL不是“初始化”的过程,而是一个状态机。那些“初始化”语句应该放在你的绘制代码中,进入它们所需的上下文。


我在顶部添加了glEnable(GL_DEPTH_TEST);,在OpenGL和QPainter之间添加了glDisable(GL_DEPTH_TEST); - 天哪,它起作用了!非常感谢。 - user816098

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接