Matrixstack

Aus DGL Wiki
Version vom 30. November 2013, 14:09 Uhr von Glawesome (Diskussion | Beiträge) (Hinweis zur Deprecation hinzugefüt, Stack verlinkt)

Wechseln zu: Navigation, Suche
Info DGL.png Seit Version 3.0 bietet OpenGL keinen eigenen Matrix-Stack mehr. Wer diese oder neuere OpenGL-Versionen nutzen möchte, muss ihn daher bei Bedarf selbst implementieren. Moderne Programmiersprachen bringen bereits Templates/generische Klassen für die Datenstruktur Stack an, was eine Menge Arbeit und Fehler erspart. In C++ z.B. std::stack.

Was ist das?

Die deutsche Übersetzung von STACK erklärt fast schon alles: Ein Stack ist ein Stapel. Und ein Matrixstack entsprechend ein Stapel mit Matrizen. Das besondere an der Datenstruktur Stack ist:

  • Neue Werte werden auf den Stack gelegt (liegen immer ganz oben!)
  • Werte können nur von der Spitze des Stacks entnommen werden (Speicherprinzip LIFO Last In First Out)
  • Zugriff auf Daten die nicht ganz oben liegen ist nicht erlaubt.


Was nützt das?

Durch den LIFO Zugriff erreicht man eine Art Hierarchie. Dadurch ist es leicht möglich "die letzte Matrix" wiederherzustellen. Sie liegt ja unter der aktuellen Matrix auf dem Stack.

OpenGL kann verschieden viele Matrizen auf einen Stack legen. Wieviel genau kann mittels glGet und den Token GL_MAX_MODELVIEW_STACK_DEPTH, GL_MAX_PROJECTION_STACK_DEPTH bzw. GL_MAX_TEXTURE_STACK_DEPTH ermittelt werden.
(Es gibt noch weitere Stacks. Z.B. den Name Stack und den Attribut Stack)


Wie arbeite ich mit dem Matrixstack?

Wer glaubt, dass man nichts machen müsste um auf den Matrixstack zu zugreifen der liegt richtig. Allerdings nur bezüglich der obersten Matrix. Wenn man eine Matrix auf den Stack legen will oder die letzte vom Stack holen will, dann benötigt man noch die beiden Befehle glPushMatrix und glPopMatrix


Client - Server Problem

Der gerade beschriebene Matrixstack befindet sich auf dem Server (OpenGL ist ein Client Server System. Siehe Beschreibung von OpenGL).
Es gibt aber auch einen Stack der lokal beim Clienten liegen (dieser Speichert Clientattribute). Für diesen Stack gibt es die Befehle glPushClientAttrib und glPopClientAttrib.