【问题标题】:Qt & OpenGL - QGLWidget & QPainter: depth bufferingQt & OpenGL - QGLWidget & QPainter:深度缓冲
【发布时间】:2011-07-15 15:14:41
【问题描述】:

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

当我没有叠加层时,我的深度缓冲工作正常。如果叠加层被绘制,我的深度缓冲区就会离开:我可以看到应该被前面的对象隐藏的东西。

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 将其混合。

【问题讨论】:

    标签: qt opengl overlay qpainter qglwidget


    【解决方案1】:

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

    【讨论】:

    • 我添加了 glEnable(GL_DEPTH_TEST);在顶部和 glDisable(GL_DEPTH_TEST);在 OpenGL 和 QPainter 的东西之间 - 哎呀,它的工作原理!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多