Qt & OpenGL - QGLWidget & QPainter: буферизация глубины

Я создаю подкласс QGLWidget и имею свой код рисования в paintEvent вместо paintGL, поскольку я хочу нарисовать 2D-наложение с помощью QPainter поверх моих 3D-материалов, сделанных с помощью OpenGL.

Моя буферизация глубины отлично работает, когда у меня нет наложения. Если наложение закрашено, мой буфер глубины уходит в самоволку: я вижу вещи, которые должны быть скрыты объектами впереди.

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 смешать его.

7
задан user816098 15 July 2011 в 15:22
поделиться