Previous: Kamera
Up: Arbeitsgruppe Renderer
Next: Zusammenfassung
Unterabschnitte
Das Rendern läuft im wesentlichen in den folgenden Schritten ab:
- Vorarbeiten durch die Laufzeitumgebung
- Aufruf der start(ObjectContainer, Camera) Methode im Renderer
- Einstellen der Lichtquellen
- Durchparsen der 3D Objekte
- Aufruf der display(void) Methode
Bevor das Rendering starten kann muss die Laufzeitumgebung erst einige
Vorarbeiten machen. Im wesentlichen ist dies die Erstellung einer Liste mit
den zu rendernden Objekten. Diese Liste wird in Form einer Enumeration an
eine Interne Datenstruktur geschickt, die den für den Renderer wichtigen
Objektcontainer füllt.
Dieser Container wird dann an den Renderer übergeben.
Der Aufruf der start(...) Methode erfolgt mit zwei Argumenten. Als erstes
Argument wird der vorher gefüllte Objektcontainer übergeben und als
zweites Argument folgt die Kamera.
Der Objektcontainer ist eine Datenstruktur, die der Renderer kennt. Sie hat
die beiden Fähigkeiten Objekte reinzustecken, und sie sich wieder
abzuholen. Wird ein Objekt hinzugefügt unterscheidet der Container, ob es
sich um eine Lichtquelle, oder um ein Shape3D handelt und speichert die
Objekte entsprechend.
Da die Lichtquellen OpenGL seitig einer Sonderbehandlung bedürfen werden
zuerst die Lichtquellen positioniert. Der Renderer kennt den in der
start(...) mitgegebenen Container und ruft eine Methode auf um die
Lichtquellen zu positionieren. Diese Methode wiederum holt sich aus dem
Container den Vektor mit den Lichtquellen und durchläuft diesen
sequentiell und initialisiert die darin enthaltenen Lichtquellen.
Nach dem Ende der Methode fährt die start(...) Methode mit dem parsen
der 3D Objekte fort.
Die Methode zum darstellen der 3D Objekte durchläuft wieder den Vektor mit
den darzustellenden Objekten und merkt sich das jeweils aktuelle Objekt.
Dies ist notwendig, da ein Objekt seine Modellkoordinaten, und den weg, wie
es an die Weltkoordinaten kommt kennt. Den Modellkoordinaten wird
apply(Renderer) gesagt. Die entsprechenden Geometrien rufen die für sie
zuständigen Methoden im Renderer auf. Da den Geometrien, aber die
Verbindung zu den Weltkoordinaten fehlt, muss der Renderer das aktuelle zu
rendernde Objekt kennen, um dieses dann nach seinen Weltkoordinaten zu
fragen.
Im weiteren wird das zu rendernde Objekt nach seinen Eigenschaften gefragt
und diese in OpenGL API Aufrufe umgewandelt.
In der display() Methode steht eigentlich keine einzige Zeile Code mehr.
Dort werden nur noch die Puffer für das Double Buffering geswappt um die
vorher vorbereiteten Objekte darzustellen.
OpenGL
Der Renderer wurde mit dem OpenGL API von Silicon Graphics implementiert.
OpenGL wurde gewählt, weil es Implementationen für Windows und
verschiedene UNIX Derivate gibt. Ausserdem wird OpenGL von vielen aktuellen
Graphikkarten Hardwareseitig unterstützt und ist damit bedeutend schneller
als ein Softwarerenderer. Zuletzt auch deswegen, weil es OpenGL Wrapper
Klassen für Java gibt.
OpenGL hat ausserdem den Vorteil viele Algorithmen für das 3D rendern
schon vorimplementiert zu haben, so dass sich die effektive Arbeit oft
darauf beschränkt die gewünschten Effekte in die richtigen OpenGL
Aufrufe umzuwandeln.
Doch die Benutzung von OpenGL hat auch Probleme aufgeworfen, so musste oft
für die Lösung von Problemen auf die Beschränkungen durch das
prozedurale OpenGL Rücksicht genommen werden und die Objektorientiertheit
konnte nicht immer bis in das letzte Detail durchgezogen werden.
Nichts desto trotz wurden möglichst wenig Zugeständnisse an OpenGL
gemacht, da der Renderer ja nur eine Komponente in dem Gesamtkonzept ist und
einfach austauschbar sein soll.
Previous: Kamera
Up: Arbeitsgruppe Renderer
Next: Zusammenfassung