2015-10-31 13 views
15

Sto utilizzando QML e volevo eseguire codice OpenGL personalizzato. Ho creato un widget personalizzato in C++ (estendendo QQuickItem) e sovrascritto la funzione paint().
Quando eseguo la mia applicazione, le stampe consoleProblemi di buffer di profondità e buffer di stencil QML

QSGContext::initialize: depth buffer support missing, expect rendering errors 
QSGContext::initialize: stencil buffer support missing, expect rendering errors 

E proprio come predetto, io capisco errori di rendering. Userò un modello di ragno come esempio. Ecco cosa vorrei

spider stl

Ed ecco quello che sto ricevendo enter image description here

Anche io non so esattamente come descriverlo, ma in fondo la faccia opposta (che dovrebbe essere bloccato da la faccia anteriore) è visibile mentre lo ruoto.

Sono riuscito a sbarazzarsi di errore di buffer di profondità con questo:

void MyGLWidget::handleWindowChanged(QQuickWindow *win) 
{ 
    if (win) { 
     connect(win, SIGNAL(beforeSynchronizing()), this, SLOT(sync()), Qt::DirectConnection); 
     connect(win, SIGNAL(sceneGraphInvalidated()), this, SLOT(cleanup()), Qt::DirectConnection); 
     win->setClearBeforeRendering(false); 
     QSurfaceFormat glFormat; 
     glFormat.setVersion(3,2); 
     glFormat.setProfile(QSurfaceFormat::CoreProfile); 




     /*I'm showing everything for context, but this is the key line*/ 
     glFormat.setDepthBufferSize(1); 






     win->setFormat(glFormat); 

    } 
} 

Così ora sto ottenendo soltanto l'errore stencil, ma che causa un problema diverso. Un lato è completamente nero e non mostra alcuna illuminazione.

enter image description here

alcune altre informazioni di fondo: Sto visualizzando un QQuickView. Il mio OpenGLWidget viene importato in QML e incorporato in questo modo:

MyGLWidget { 
    id: glWidget 
} 

nella vernice() del mio renderer, mi chiamo glEnable(GL_DEPTH_TEST) e glEnable(GL_STENCIL_TEST) in alto, ma che non sembra di fare nulla. Forse lo sto chiamando nel contesto sbagliato? Non so dove altro potrei chiamarlo, comunque.

risposta

3

Come risulta, tutti i miei modelli (incluso lo spider) avevano le normali dei vertici non corrette, quindi i problemi di ombreggiatura. Avrei dovuto controllarli in altri software di rendering.

glFormat.setDepthBufferSize(1) era la vera soluzione

1

Prova

glDepthMask(GL_TRUE); 
// your paintings here 
glDepthMask(GL_FALSE); 

Vedi anche Scene Graph and Rendering.

+0

Purtroppo non è stato modificato nulla. Dò un'occhiata al link e vedrò se riesco a trovare una soluzione – faraza

Problemi correlati