Podklasę QGLWidget i mój kod graficzny w paintEvent zamiast paintGL, ponieważ chcę pomalować nakładkę 2D za pomocą QPaintera nad moimi materiałami 3D wykonanymi za pomocą OpenGL.Qt i OpenGL - QGLWidget i QPainter: buforowanie głębi
Moje buforowanie głębi działa dobrze, gdy nie mam nakładki. Jeśli nakładka zostanie pomalowana, mój bufor głębi przejdzie w tryb AWOL: widzę rzeczy, które powinny być ukryte przed obiektami.
initializeGL wygląda następująco:
qglClearColor(Qt::black);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
Struktura mojego kodu paintEvent jest następujący:
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();
W zależności od czy ta sama scena wygląda w porządku (przy wyłączonym mapowaniu) lub źle (nakładka włączona). Oprócz dziwnego problemu z buforowaniem głębokości działa on doskonale.
Moje (dzikie) przypuszczenie, że konstrukcja QPaintera wyłącza buforowanie głębi. Każda wskazówka byłaby bardzo ceniona. Przypuszczam, że rozwiązaniem awaryjnym byłoby renderowanie nakładki do tekstury i łączenie przez OpenGL.
Dodałem glEnable (GL_DEPTH_TEST); u góry i glDisable (GL_DEPTH_TEST); między rzeczami OpenGL i QPainter - i yikes, to działa! Wielkie dzięki. – user816098