Transparenzen
Eine Sache vorweg: Anscheinend lesen mehr Leute meine Seite, als ich weiß. Bitte, schreibt Kommentare, ich denke wirklich immer “Die Seite liest eh keiner”.
Wenn euch jemand fragen würde, was von den folgenden Begriffen am schwierigsten wäre:
- Bump mapping
- Environment mapping
- Phong shading
- Transparenzen
würdet ihr ihn wohl entweder ignorieren oder eine Fangfrage wittern und auf Transparenzen tippen. So ist es nämlich auch. Ich möchte jetzt ungern auf einen Diskurs abschweifen, wieso dass so ist, aber ich habe wohl keine Wahl. Wer die Antwort schon kennt: Nach dem Screenshot geht es normal weiter.
Ein Hauptproblem bei 3D-Computergrafik ist, dass die Polygone so auf dem Bildschirm erscheinen, wie sie in die Grafikkarte gefüttert werden, was im Normalfalle falsch ist. Irgend ein Polygon, dass weiter hinten sein soll, befindet sich dann nämlich immer vor einem, dass vorne sein soll. Es gibt zwei Lösungen: Die Polygone sortieren und von hinten nach vorne zeichnen, oder den sogenannten Depth-Buffer (Tiefenpuffer, wenn man so will).
Dieser funktioniert recht einfach und ist auch einfach anzuwenden: Für jeden Pixel wird gespeichert, wie nah er an der Kamera ist. Bei jedem neuen Pixel, der auf den Bildschirm gezeichnet werden soll, wird geprüft, ob er näher an der Kamera ist als der vorige oder nicht. Wenn er nicht näher dran ist, wird er nicht gezeichnet, ansonsten wird er gezeichnet und der Depth-Buffer aktualisiert. Genial, oder?
Leider gibt es ein Problem, sobald Transparenzen im Spiel sind. Es ist schließlich völlig legal, einen Pixel hinter einen anderen Pixel, der durchsichtig ist, zu zeichnen. Die Lösung hierfür sieht wie folgt aus:
- Transparente Polygone werden zusammengefasst und erst am Ende eines Frames gezeichnet.
- Dabei wird der Depth-Buffer auf nur lesen gesetzt, so dass transparente Polygone hinter festen Objekten verschwinden aber nicht andersrum.
- Die transparenten Polygone werden von hinten nach vorne gezeichnet.
Und das bedeutet wiederum, dass man zumindest die transparenten Polygone irgendwie einzeln betrachten muss und ihnen eine Sonderbehandlung zukommt.
Ich hatte dieses Problem, als ich dabei war, Bäume einzubauen. Dieses Wochende bin ich extra in mein lokales Gebirge gefahren und habe Bäume fotografiert. Fürs Spiel wollte ich die Standardtechnik anwenden, dass Bäume einfach ein Kreuz von zwei Quadraten sind, die jeweils eine Baumtextur mit großen Bereichen Transparent sind. Leider lief dies mit meinem alten Transparenzcode wegen den oben beschriebenen Problemen nicht. Also baute ich die nötigen Features ein - und es lief nicht, Ergebnis siehe oben.
Es wäre langweilig, die ganzen Probleme und Fehler, die ich hatte, aufzuzählen, aber es waren mehr als genug, darunter einige besonders peinliche. Wie auch immer, am Ende lief es:
oder zumindest fast, die Reihenfolge war falsch. Nach ein wenig Korrektur (exakt ein Zeichen wurde geändert) sah es dann so aus:
Ach ja, ich vergaß: Das feste Terrain musste ich abschalten, weil sonst das Spiel immer abstürtzt. Ich sage bescheid, wenn sich das ändert.
Geschrieben am 22. November 2005 um 17:21