Mehr als nur ein Texturpatch? (Teil 3)


Mehr als nur ein Texturpatch? (Teil 3)

ThielHater | 06.02.2021

In diesem Teil der Serie gehen wir näher darauf ein, wie die Farbe eines Pixels beschrieben wird und wie transparente Pixel in Gothic dargestellt werden als auch, was dabei nicht so rund läuft.

Zunächst einmal kann die Farbe eines Pixels durch mehrere Modelle beschrieben werden. Am gängigsten ist dabei das RGB-Farbmodell, bei dem Rot, Grün und Blau als Grundfarben verwendet werden. Die einzelnen Komponenten werden dabei auch als Kanäle bezeichnet. Die Farben werden additiv gemischt, das heißt alle zusammen ergeben Weiß. Diese Art der Farbmischung kennt ihr bereits vom Licht aus dem Physikunterricht. Der Deckfarbkasten aus dem Kunstunterricht arbeitet übrigens mit subtraktiver Farbmischung, bei der alle Farben zusammen Schwarz ergeben.

Im Computer wird indes pro Farbkanal 1 Byte verwendet, welches wiederum aus 8 Bit besteht. Da jedes Bit die Werte 0 und 1 annehmen kann, kann ein Byte 28 = 256 verschiedene Werte annehmen. Da wir 3 Farbkanäle mit je 1 Byte haben, können wir also 2563 = 16.777.216 verschiedene Farben beschreiben.

Zur Illustration aller darstellbaren Farben verwende ich einen Würfel, bei dem einmal die Rückseite und einmal die Vorderseite dargestellt wird. Wer mag, kann sich den Würfel dank Scott Anderson und Ellen Hildrethauch vom Wellesley College auch in 3D anschauen.

Zur Darstellung von beispielsweise Vegetation, wie den Blättern an einem Ast, brauchen wir jedenfalls auch durchsichtige Pixel. Dafür gibt es eine weitere Komponente, den so genannten Alpha-Kanal. Im Idealfall wird dazu ebenfalls ein Byte verwendet, was 256 verschiedene Stufen von transparent bis opak ermöglicht. Da die Texturen jedoch komprimiert werden, stehen in der Regel nur 4 oder gar 1 Bit für den Alpha-Kanal zur Verfügung. Bei Transparenzverläufen sieht man die Unterschiede direkt. Bei den Blättern hingegen gibt es zwischen 8 und 4 Bit kaum einen Unterschied, während man bei 1 Bit die harten Kanten klar erkennen kann.

Zum Zeichnen von Flächen mit Alpha-Texturen gibt es in der Computergrafik zwei Modi, das Alpha-Blending und das Alpha-Testing. Beim Alpha-Testing wird ein Test oder eher eine Bedingung formuliert welche darüber entscheidet, ob ein Pixel gezeichnet wird oder nicht. Üblicherweise vergleicht man dazu Wert des Alpha-Kanals mit einem Schwellwert. Beim Alpha-Blending hingegen wird jedes Pixel gezeichnet und dabei mit dem bereits gezeichneten Bild vermischt. Es gibt dabei mehrere Misch-Modi für verschiedene Zwecke. In unserem Fall würden wir das Pixel aber einfach so zeichnen, wie es ist. Grundsätzlich haben beide Techniken ihre Vor- und Nachteile sowie damit verbundene Darstellungsfehler. Beim Alpha-Testing werden die Pixel, welche die Bedingung erfüllen, stets opak gezeichnet obwohl sie mitunter halbtransparent sind. Beim Alpha-Blending kommt es bei sich schneidende Flächen zu Darstellungsfehlern, welche aber meist nicht auffallen.

Unglücklicherweise verwendet Gothic nur 1 Bit für den Alpha-Kanal und zeichnet die Texturen dementsprechend mit Alpha-Testing, wodurch die Darstellung von Transparenzverläufen und weichen Kanten nicht möglich ist.

Erfreulicherweise kann Gothic komprimierte Texturen mit 4 Bit Alpha aber durchaus lesen. Ich habe daher einige Zeit darauf verwendet, Gothic das Alpha-Blending beizubringen. Zu meinem Bedauern waren diese Bemühungen jedoch nicht von Erfolg gekrönt. Bei meiner Recherche bin ich jedoch auf diesen Blogartikel von Shawn Hargreaves gestoßen, welcher im letzten Absatz ein zweistufiges Verfahren beschreibt.

Dabei werden zunächst die größtenteils opaken Pixel der Textur mit Alpha-Testing und die übrigen mit Alpha-Blending gezeichnet. Ich habe den beschriebenen Ansatz übernommen und den Schwellenwert optimiert, um Darstellungsfehler zu reduzieren. Das Besondere dabei ist, dass der Z-Buffer im zweiten Durchgang deaktiviert ist. Dieser ist für die Verarbeitung der Tiefeninformationen verantwortlich und stellt so sicher, dass Flächen die näher an der Kamera sind solche verdecken, die sich weiter entfernt dahinter befinden. Durch das Deaktivieren des Z-Buffer müssen wir eigentlich dafür sorgen, die Flächen in der korrekten Reihenfolge von hinten nach vorne zu zeichnen. Da der Ast und die Blätter zu diesem Zeitpunkt jedoch bereits gezeichnet wurden und wir nur noch die weichen Kanten nachträglich zeichnen wollen, ist das kein Problem.

Das Ergebnis kann sich sehen lassen, verringert allerdings die gezeichneten Bilder pro Sekunde (Frames per Second, FPS) um etwa ein Fünftel, da viele Objekte in der Welt doppelt gezeichnet werden. Da Gothic 2 korrekt mit Alpha-Blending umgehen kann, hoffe ich dieses Feature eines Tages auch in Gothic 1 zum Laufen zu kriegen.

Im vierten Teil wird es nebulös, dunkel und auch ein bisschen gruselig. Doch keine Angst, Innos wird über uns wachen!