Canvas
Die Canvas ist die konkrete Implementation der NearPlane des Frustums Auf ihr werden die Objekte aus dem 3D-Raum projiziert. Im Prinzip ist die Canvas ein zweidimensionales Array von Pixeln (Das Kunstwort Pixel ist zusammengesetzt aus den Worten Picture und Cell). Jedes Pixel repräsentiert einen Farbpunkt auf dem Bildschirm. Es wird der RGB-Farbraum verwendet, d.h. jede Pixelfarbe setzt sich aus den drei additiven Primärfarben Rot, Grün und Blau zusammen. Der Wertebereich einer Primärfarbe liegt zwischen 0 und 255.
Implementiert ist die Canvas als simples Byte-Array. Da eine Primärfarbe in einem Byte untergebracht werden kann, benötigt man für eine Canvas von 640 mal 400 Bildschirmpunkten 640*400*3 Bytes = 768 KB.
Das Konstrukt des Byte-Arrays ist Sprachen- und Plattformunabhängig. In Java und in C/C++ gibt es die diesen Variablentyp (als unsigned char, bzw. byte). Das hat den Charme, daß die Engine nur dieses Byte-Array kennen muss. Erst beim rendern der Canvas auf das jeweilige Zielsystem wird sie in ein kompatibles Format umgewandelt:
Unter Windows wird daraus eine BITMAP erzeugt und via SetDIBitsToDevice und BitBlt gerendert. In OpenGL kann das Array direkt an glDrawPixels übergeben werden.
Z-Buffer
Wie bereits beim Painter's Algorithm angesprochen, gibt es Probleme beim zeichnen von sich überdeckenden Polygonen. Wie sieht also die Alternative aus?
Ganz einfach:Analog zur Canvas wird ein float-Array angelegt, das zu jedem Pixel die Tiefeninformation speichert. Vor dem Frameaufbau wird dieser Z-Buffer initialisiert (mit MAX-Wert).
Bei der Projektion wird dann von jedem Pixel der Z-Wert berechtet und mit dem korrespondierenden Wert im Z-Buffer verglichen. Ist der Wert im Z-Buffer größer, wird er mit dem neuen Wert überschrieben.
Diese Methode ist simpel und funktioniert einwandfrei. Sie hat aber auch Nachteile:
- Der Z-Buffer benötigt viel Speicher, z.B. 640*400*4 = 1 MByte
- Lesen, Wertevergleich und Schreiben des Z-Buffer kostet viel CPU-Zeit
Für die Implementierung eines Partikelsystems für Special Effects wie z.B. Feuer oder Rauch wird der Z-Buffer auch benötigt.