2011-07-15 11 views
5

QGLWidget alt sınıfını ve OpenGL ile yaptığım 3B nesneler üzerinde QPainter kullanarak bir 2B katmanını boyamak istediğim gibi paintGL yerine resim kodunu boyam.Qt & OpenGL - QGLWidget & QPainter: derinlik arabelleği

Derinlemesine arabelleğe alma, bindirme olmadığında iyi çalışıyor. Eğer bindirme boyanırsa, derinlik tamponum AWOL'dur: Ön taraftaki nesneler tarafından gizlenmesi gereken nesneleri görebilirim.

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

şöyle benim paintEvent kod yapısı şöyledir::

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

, aynı sahne yolunda görünüyorsa (kapalı yer paylaşımı) bağlı ya da yanlış (

initializeGL şuna benzer yer paylaşımı). Garip derinlik tampon probleminden ayrı olarak, gayet iyi çalışıyor.

Benim (doğal) tahminim, QPainter uygulamasının derinlik arabelleğini devre dışı bırakmasıdır. Herhangi bir ipucu çok takdir edilecektir. Geri dönüş bir çözümün bindirmeyi bir dokuya dönüştürmesi ve OpenGL'yi harmanlaması gerekir.

cevap

5

Neden derinlik testini gerektiği gibi etkinleştirip devre dışı bırakmıyorsunuz? OpenGL'yi "başlatmıyor", bu bir eyalet makinesi. Bu "başlangıç" ifadeleri, çizim kodunuza, ihtiyaç duydukları yere bağlamda aittir.

+0

glEnable (GL_DEPTH_TEST) ekledim; üstte ve glDisable (GL_DEPTH_TEST); OpenGL ve QPainter şeyler arasında - ve yikes, işe yarıyor! Çok teşekkürler. – user816098