prev up next

Previous: Kamera Up: Arbeitsgruppe Renderer Next: Zusammenfassung

Unterabschnitte


Renderer

Renderablauf

Das Rendern läuft im wesentlichen in den folgenden Schritten ab:

Vorarbeiten

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.

Die start(...) Methode

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.

Positionieren der Lichtquellen

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.

Parsen der 3D Objekte

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.

Aufruf der display() Methode

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.


prev up next
Previous: Kamera Up: Arbeitsgruppe Renderer Next: Zusammenfassung