2017-03-25 1 views
0

Je rencontre un problème très étrange dans OpenGl. Le code suivant produit un cube jaune comme prévuCube ne s'affiche que si j'appelle glPopMatrix après glEnd (et non l'inverse)

glPushMatrix(); 
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (GLfloat[]){ 1, 1, 0, 1 }); 
glBegin(GL_LINE_LOOP); 
glutSolidCube(1); 
glPopMatrix(); 
glEnd(); 

Cependant quand je mets glPopMatrix() après glEnd(), je reçois juste un écran noir sans un cube.

glPushMatrix(); 
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (GLfloat[]){ 1, 1, 0, 1 }); 
glBegin(GL_LINE_LOOP); 
glutSolidCube(1); 
glEnd(); 
glPopMatrix(); 

Pour moi, la seconde approche est plus logique, (push, début, fin puis pop) et je ne sais vraiment pas pourquoi il ne fonctionne pas. Toute aide est la bienvenue, merci!

+0

Puisque le deuxième exemple devrait être le bon, je soupçonne fortement que tout ce qui ne va pas avec votre code est en dehors du code que vous avez posté. Êtes-vous en train de modifier la matrice entre 'PushMatrix' et' PopMatrix'? Si c'est le cas, c'est probablement * (juste deviner, cependant) que la nouvelle matrice que vous créez est fausse, alors que celle d'avant est correcte, et puisque vous retournez la précédente avant 'glEnd', elle est en fait celui qui s'habitue à la transformation. – Dolda2000

Répondre

2

Le problème n'est pas le placement de l'appel glPopMatrix(). Le problème est avec glBegin() et glEnd(). Retirez-les, glutSolidCube() fait déjà cela.

Si vous utilisez FreeGLUT, alors glutSolidCube() n'utilisera même pas glBegin() et glEnd(), et utilisera des tableaux de vertex sous le capot. Donc, pour le dire simplement, vous êtes probablement en train de confondre votre pilote et c'est pourquoi vous obtenez le résultat bizarre.

+0

Merci, en les enlevant travaillé! – user1354784