Qt & OpenGL - QGLWidget & QPainter: буферизация глубины - PullRequest
7 голосов
/ 15 июля 2011

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

Моя буферизация глубины работает нормально, когда яиметь оверлейЕсли наложение нарисовано, мой буфер глубины становится 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 Ответ

5 голосов
/ 15 июля 2011

Почему бы вам просто не включить и не отключить проверку глубины по мере необходимости? Вы не «инициализируете» OpenGL, это конечный автомат. Эти «инициализирующие» операторы находятся в вашем коде чертежа, в контексте, где они необходимы.

...