2011-12-14 11 views
10

Sto lavorando su alcune applicazioni grafiche e ho ottenuto un dopo glPopAttrib(). Prevedere la risposta "Sembra che chiami glPopAttrib() all'interno del blocco glBegin/glEnd" per favore vedi questo log che ho fatto con GLIntercept.glPopAttrib & GL_INVALID_OPERATION

/* tons of wglGetProcAddress* */ 
wglGetProcAddress("glEndOcclusionQueryNV")=087C9B10 
wglGetProcAddress("glBeginTransformFeedbackN...")=087C9ED0 
wglGetProcAddress("glEndTransformFeedbackNV")=087C9F00 
glPushAttrib(GL_VIEWPORT_BIT) 
glPushAttrib(GL_COLOR_BUFFER_BIT) 
glPushAttrib(GL_COLOR_BUFFER_BIT) 
glPopAttrib() 
glPopAttrib() glGetError() = GL_INVALID_OPERATION # <---- THIS 
glPopAttrib() 
glPushAttrib(GL_VIEWPORT_BIT) 
glPushAttrib(GL_COLOR_BUFFER_BIT) 
glPushAttrib(GL_COLOR_BUFFER_BIT) 
glPopAttrib() 
glPushAttrib(GL_POINT_BIT | GL_LINE_BIT | GL_COLOR_BUFFER_BIT) 
glPopAttrib() 
glPopAttrib() 
glPopAttrib() 
glPushAttrib(GL_VIEWPORT_BIT) 
glPushAttrib(GL_COLOR_BUFFER_BIT) 
glPushAttrib(GL_COLOR_BUFFER_BIT) 
glPopAttrib() 
glPopAttrib() 
glPopAttrib() 
/* and so on */ 

No glBegin/glEnd chiamate sono fatte prima di errori causeing glPopAttrib(). (Ho usato il comando findstr per filtrare il registro).

L'errore viene visualizzato solo una volta, nessun errore di tipo (o altri) durante l'esecuzione del codice. Ho il sospetto che dovrei chiamare qualche funzione prima del glPushAttrib(GL_VIEWPORT_BIT) o qualcosa del genere.

+0

Ciò significa che l'errore si è verificato prima di una chiamata a glPopAttrib –

+0

No, non lo è. GLIntercept restituisce gli errori verificatisi per il comando specifico su cui sono effettivamente accaduti. –

+0

Intendi dire che dopo il primo errore tutti i seguenti cicli di rendering sono a posto? In modo che l'errore si verifica solo una volta al primo passaggio? – Kromster

risposta

2

Interessante problema. Mi ha fatto pensare ..

Ciò che potrebbe accadere è che alcune delle variabili di stato associate allo COLOR_BUFFER_BIT non sono state inizializzate con valori corretti quando il contesto OpenGL è stato ottenuto dal sistema di finestre. Quando hai fatto un glPushAttrib, quei (probabilmente) valori errati sono stati salvati, e quando l'attrib è stato spuntato, i valori errati sono stati ripristinati - causando un'operazione non valida? Suona logico?

2

ho avuto lo stesso problema, e finalmente capito la causa: Quando si chiama un glBindFramebuffer tra un glPushAttrib(GL_COLOR_BUFFER_BIT) e glPopAttrib, un GL_INVALID_OPERATION è causata sulla chiamata glPopAttrib.

Ciò accade anche quando si ripristina il binding del buffer del frame originale prima di chiamare glPopAttrib.

L'unica soluzione sembra essere o evitare ogni glBindFramebuffer chiamate tra la glPushAttrib e glPopAttrib, o evitare l'utilizzo glPushAttrib e glPopAttrib memorizzando e ripristinando tutte le pertinenti stato cuscinetto colore manualmente.