Zeichnen in 3D

In einer 3D Szene können Objekte die näher am Blickpunkt (Viewpoint) sind Objekte die weiter vom Blickpunkt entfernt sind, verdecken. Um eine realistische Szene zu zeichnen, muß ein Löschen der verdeckten Tiefe durchgeführt werden, um sicherzugehen, daß verdeckte Teile von Objekten nicht sichtbar sind. Das Löschen von der verdeckten Tiefe wird durch den Gebrauch eines Puffers für die Tiefe und einer Prüfung der Tiefe erreicht.

Wenn ein Zeichnen-Ereignis auftritt, wird ein Tiefen- oder z-Wert, bezogen auf jedes Pixel im Puffer für die Tiefe gespeichert. Ein Tiefe-Test wird für jeden Scheitelpunkt in der Szene durchgeführt. Während eines Tiefe-Tests wird der Puffer für die Tiefe überprüft, um zu erkennen, ob bereits ein anderer Scheitelpunkt weiter vorn gezogen wurde, der den aktuellen Scheitelpunkt verdecken würde. In dies der Fall, wird der Scheitelpunkt nicht gezeichnet.

Der TK-Befehl tkInitDisplayMode(TK_DEPTH | irgendwelche anderen Modi) muß aufgerufen werden, um den Gebrauch des Puffers für Tiefe zu spezifizieren. Pufferbetrieb für die Tiefe muß mit dem Befehl glEnable(GL_DEPTH_TEST) aktiviert werden. Vor dem zeichnen einer Szene, sollte der Puffer für die Tiefe mit dem Befehl glClear(GL_DEPTH_BUFFER_BIT) geleert werden.

Standardmäßig zeichnet OpenGL Polygone im Füllmodus, indem es alle Pixel ausfüllt, die innerhalb der Umrandung liegen. Sie können aber auch im Zeilenmodus als umrissene Polygone oder in Punktmodus als Punkte auf den Scheitelpunkten gezeichnet werden. In OpenGL hat ein Polygon eine Frontseite und eine Rückseite. Die Seiten können im gleichen Modus oder in unterschiedlichen Modi gezeichnet werden, um beispielweise Schnitt-Ansichten von räumlichen Objekten darzustellen.

Der Befehl glPolygonMode(Glenum face, GLenum mode) steuert den Zeichnenmodus für die vordere und rückseitige Ansicht eines Polygons. Der Parameter face kann die Werte GL_FRONT, GL_BACK oder GL_FRONT_AND_BACK annehmen; mode kann die Werte GL_POINT, GL_LINE, oder GL_FILL annehmen, um anzuzeigen, ob Polygone als Punkte, umrissen oder gefüllt gezeichnet werden sollen. Standardmäßig werden Frontseite und Rückseite gefüllt gezeichnet.

Ein gefülltes Polygon kann komplett ausgefüllt oder mit einem bestimmten Muster punktiert werden. Das Punktierungsmuster muß mit dem Befehl glPolygonStipple(const GLubyte *mask) definiert werden, wobei das mask Argument ein Zeiger auf ein 32x32 Bitmap ist, das als Maske von Nullen und Einsen gedeutet wird. Eine 1 zeigt an, daß das entsprechende Pixel im Polygon gezeichnet wird, eine 0 zeigt an, daß es nicht gezeichnet wird. Die Zustandsvariable GL_POLYGON_STIPPLE muß durch den Aufruf von glEnable(GL_POLYGON_STIPPLE) aktiviert werden, damit das Punktieren auftritt.

Der Befehl glCullFace(GLenum mode) legt fest, welche Polygone ausgewählt werden sollen, bevor sie in Bildschirmkoordinaten umgewandelt werden. Der Parameter mode ist entweder GL_FRONT, GL_BACK, oder GL_FRONT_AND_BACK um Vorderseite, Rückseite oder das gesamte Polygon anzuzeigen. Falls erwünscht, muß die Zustandsvariable für das Auswählen, GL_CULL_FACE, aktiviert werden.

Abbildung 18-2. OpenGL Ausgabe polygons.c