2011-07-15 12 views
5

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.

Odpowiedz

5

Dlaczego po prostu nie włączysz i nie wyłączysz testu głębokości w razie potrzeby? Nie "inicjalizujesz" OpenGL, jest to automat stanów. Te "inicjujące" instrukcje należą do twojego kodu rysunkowego, do kontekstu, w którym są potrzebne.

+0

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