2010-08-18 14 views
2

Je sais que pour sauvegarder/restaurer l'état de la matrice, vous utilisez les opérations push/pop standard. Je n'ai pas été en mesure de trouver une convention décente pour sauver/restaurer l'état, comme lors de l'utilisation de glLineWidth() ou glColor4ub().La bonne façon d'enregistrer/restaurer l'état OpenGL ES

Il semble pas vraiment nécessaire tant que vous définissez votre largeur de ligne ou la couleur correctement lorsque vous voulez dessiner quelque chose, mais je peux voir un exemple d'où vous êtes dans votre propre fonction de dessin, appeler une fonction de dessin distincte qui change la largeur de la ligne sur vous à votre insu, et puis quand vous allez continuer à dessiner, il ne sortira pas comme prévu. Pour corriger cela, vous pouvez réinitialiser votre largeur de ligne après avoir appelé une fonction que vous ne savez pas ce qu'il fait, mais qui semble inélégant et je pense qu'il devrait déjà y avoir une solution à cela, mais que j'ai manqué en quelque sorte.

Pour mon code, je l'ai fait cela au début de chaque fonction de dessin:

GLfloat savedLineWidth = 1.0f; 
glGetFloatv(GL_LINE_WIDTH, &savedLineWidth); 
glLineWidth(lineWidth); 

Et puis restaurer l'état à la fin de la fonction de dessin comme ceci:

glLineWidth(savedLineWidth); 

Cela ne m'aide pas vraiment à moins que je suppose que chaque fonction de dessin dont je ne connais pas l'intérieur est agréable et restaure l'état tout seul.

Dois-je faire cette hypothèse? Ou est-ce que je manque quelque chose?

Répondre

1

Si tel était OpenGL simple (non variante ES), vous pouvez pousser l'attribut comme:

glPushAttrib(GL_LINE_WIDTH); 
glLineWidth(2.0f); 
... etc ... 
glPopAttrib(); 

Hélas, dans ce OpenGL ES n'est pas disponible. Votre approche de l'obtention et du réglage est à peu près aussi bonne que vous obtiendrez. Essayez simplement de réduire le nombre de tentatives, car cela prend beaucoup de temps. Contrairement à l'envoi, l'obtention n'est pas mise en mémoire tampon. Peut-être que votre approche devrait être de ne pas s'inquiéter. Chaque fois que vous voulez définir la largeur de la ligne, il suffit de le définir. La largeur de la ligne ne devrait pas trop affecter.

Appel difficile. Cela dépend de ce que sont ces autres fonctions de dessin. Avez-vous le code? Peut-être pourriez-vous regarder?

+0

C'est cool. Je ne savais pas que glPushAttrib() et glPopAttrib() étaient disponibles dans la variante non ES d'OpenGL. Je n'ai pas non plus pensé à boucher le bus avec des demandes. Oui, j'ai le code. C'est juste un code de dessin avec lequel je triture actuellement pour essayer d'apprendre OpenGL ES. Je cherchais juste des conseils avant de développer de mauvaises habitudes. – djdrzzy