2011-07-15 21 views
5

Subclase QGLWidget y tengo mi código de pintura en paintEvent en lugar de paintGL porque quiero pintar una superposición 2D usando QPainter sobre mis cosas 3D hechas con OpenGL.Qt & OpenGL - QGLWidget & QPainter: buffering de profundidad

Mi buffer de profundidad funciona bien cuando no tengo una superposición. Si la superposición está pintada, mi memoria intermedia de profundidad se desactivará. Puedo ver cosas que deberían estar ocultas por los objetos que están delante.

initializeGL se ve así:

qglClearColor(Qt::black); 
glShadeModel(GL_FLAT); 
glEnable(GL_DEPTH_TEST); 
glEnable(GL_CULL_FACE); 

La estructura de mi código paintEvent es el siguiente:

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(); 

Dependiendo del caso, la misma escena se ve bien (superposición desactivada) o mal (superposición). Además del extraño problema del buffer de profundidad, funciona perfectamente bien.

Mi (salvaje) supongo que la construcción de QPainter inhabilita el almacenamiento en búfer de profundidad. Cualquier sugerencia sería muy apreciada. Supongo que una solución alternativa sería convertir mi superposición en una textura y hacer que OpenGL la combine.

Respuesta

5

¿Por qué no activa y desactiva las pruebas de profundidad según sea necesario? No "inicializa" OpenGL, es una máquina de estado. Esas declaraciones de "inicialización" pertenecen a su código de dibujo, al contexto donde se necesitan.

+0

He añadido glEnable (GL_DEPTH_TEST); en la parte superior y glDisable (GL_DEPTH_TEST); entre las cosas de OpenGL y QPainter, ¡y sí, funciona! Gracias un montón. – user816098

Cuestiones relacionadas