Я создаю подкласс 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 смешать его.