PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : OpenGL Matrix Stack


Einfachkrank
2003-11-23, 19:08:48
Hi,

wenn ich mit den Matricen von OpenGL arbeite, sprich mit glPushMatrix() und glPopMatrix(), welche States oder Einstellungen von OpenGL werden davon betroffen? Kann es sein, dass man damit ne Menge Speed sparen kann, wenn ich das Zurücksetzen vieler States wie hier weglassen würde, weil diese durch das Widerherstellen der letzten Matrix so wie so wieder eingestellt werden:

glPushMatrix();

glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glColor3f(1.0f, 1.0f, 1.0f);
// ...

// Objekte rendern

// glEnable(GL_DEPTH_TEST);
// glEnable(GL_LIGHTING);
// glEnable(GL_TEXTURE_2D);
// glColor3f(0.0f, 0.0f, 1.0f);

glPopMatrix();

MFG Einfachkrank

HellHorse
2003-11-23, 19:24:22
IIRC werden nur Tranformationsmatizen und keine States gespeichert. Daher "Matrix Stack" und nicht "Matirx und State Stack". :)

Achill
2003-11-23, 20:02:16
Original geschrieben von Einfachkrank
Hi,

wenn ich mit den Matricen von OpenGL arbeite, sprich mit glPushMatrix() und glPopMatrix(), welche States oder Einstellungen von OpenGL werden davon betroffen? ...

MFG Einfachkrank


Du wählst mit "void glMatrixMode(GLenum mode);" die momentan veränderbare Matrix aus (GL_MODELVIEW, GL_PROJECTION und GL_TEXTURE).

Wenn du dann glPushMatrix() oder glPopMatrix() betrifft dies die ausgewählte Matrix.

Der Stack von GL_MODELVIEW ist minimal 32 tief.
Der Stack von GL_PROJECTION ist minimal 2 tief.
Der Stack von GL_TEXTURE ist minimal 2 tief.

Achill
2003-11-23, 20:05:45
Hmm... kann nicht mehr editieren...

es sollte natürlich heisen:

Wenn du dann glPushMatrix() oder glPopMatrix() aufrufst, so betrifft dies die ausgewählte Matrix.

und noch der Hinweis, das im Red- und Bluebook von OpenGL dies alles drinnen steht - sind sehr praktisch ;)

Gnafoo
2003-11-28, 14:06:34
Nur zur Ergänzung .. für die States kann man
glPushAttrib bzw glPopAttrib benutzen.

Einfachkrank
2003-11-29, 13:04:11
Original geschrieben von Der Tod
Nur zur Ergänzung .. für die States kann man
glPushAttrib bzw glPopAttrib benutzen.

cu Der Tod
Würde dann, bei demselben Prinzip durch diese zwei Funktionen Geschwindigkeitseinsparungen entstehen?

Gnafoo
2003-11-29, 13:42:05
Weiß ich auch nicht genau .. Ich würde einfach mal ein
Testprogramm schreiben und es ausprobieren.

Demirug
2003-11-29, 14:45:03
Original geschrieben von Der Tod
Weiß ich auch nicht genau .. Ich würde einfach mal ein
Testprogramm schreiben und es ausprobieren.

cu DerTod

Im Prinzip gebe ich dir recht warne aber auch gleichzeitig davor. Das Problem dabei ist die zugrundeliegende Datenbasis. Führt man einen solchen Vergleich nur mit einer Karten und möglicherweise sogar nur mit einem Treiber durch kommt man schnell zu falschen Schlüssen.

Meine persönliche Empfehlung bei solchen Konflikten ist folgende:

Das zu lösende Problem abstrahieren dann alle möglichen Lösungen implementieren und die jeweils beste nutzen. Welche das ist muss man entweder automatisch herausfinden oder in einer Konfigliste speichern.

Dabei aber bitte die richtige Methode nicht jedesmal über eine switch-Anweisung bzw if-abfrage anspringen. Dafür nimmt man besser virtuelle Funktionen.

Achill
2003-11-29, 22:26:28
Noch ein paar Ergänzungen...

Im Redbook steht, dass es normalerweise schneller sein soll, wenn man glPushAttrib(), glPopAttrib() - 21 mögliche Masken (Serverside). Und glPushClientAttrib(), glPopClientAttrib() - 3 mögliche Masken (Clientbased) nutzt.

Als Anmerkung steht dann dort noch (Redbook S. 81), dass das Abfragen von Werten mit get*() bei Hardwareimplementierung der Werte "teuer" sein kann und das die Serverseitigen Befehle glPushAttrib(), glPopAttrib() bei einer Umsetzung auf einen Server - Clientmodells natürlich über das Netzwerkgesendet werden müssten und somit auch "kosten"...


Als alternative zu glPush*() und glPop*() könnte man sicher auch eine (mehrere) Displaylist bauen, die einem alle Werte setzen/zurücksetzt und dies auch mit nur einem Funktionsaufruf schaffen ...