Mehr als nur ein Texturpatch? (Teil 6)
Im sechsten Teil soll es um die Beleuchtung in Gothic gehen – um Licht, Schatten und Farbe. Der Ausgangspunkt war eine Frage, die ich mir damals stellte: Warum sehen unsere Texturen im Spiel anders aus als gedacht?
Es war kein großer Unterschied, eher subtil. Die Texturen wirkten matschfarben, als hätte man einen Farbfilter darüber gelegt, insbesondere die hellen Pixel waren betroffen. Ob es an der Kompression lag? Diese reduziert den Farbraum zwar, doch ich wollte es genauer wissen. Als Test sollte eine Textur dienen, die zur Hälfte aus reinweiß und tiefschwarz bestand und auf diese zerfallene Hütte gelegt wurde.
Die Schattierung war zu erwarten, doch die zwei hellen Flächen am oberen Bildrand gaben mir zu denken, waren sie doch wärmer als reinweiß. Ich verglich die Farbwerte der Textur vor und nach der Kompression mit ihrer Darstellung im Spiel:
Die Kompression hatte einen Effekt aber dieser war vernachlässigbar. Es lag auf der Hand, dass Gothic die Texturen anders darstellt als erwartet. Nur aus welchem Grund, wie funktioniert es und können wir daraus einen Vorteil für unser Projekt ziehen?
Für die Beleuchtung ist zunächst einmal der Spacer, der Editor von Gothic, zuständig. In ihm platziert man Objekte, legt das Wegnetz für die NPCs an, fügt Umgebungsgeräusche ein, gestaltet Kamerafahrten und so weiter – ein wahres Wunderwerk der Technik. Angestoßen wird die Berechnung über folgendes Dialog-Fenster:
Die Berechnung der Beleuchtung erfolgt über ein Raytracing-Verfahren, welches den Lichteinfall durch die Sonne nachstellt und dabei für jedes Vertex des Level-Meshs bestimmt, wie stark es angestrahlt wird. Diese Technik nennt man daher auch Vertex Lighting, die Intensität des Lichts wird dabei auf ein Interval von 0 bis 255 normiert. Gothic kann darüber hinaus noch Lightmaps in verschiedenen Qualitätsstufen berechnen. Dabei handelt es sich um eine Datenstruktur, welche die Beleuchtungsinformationen für mehrere Faces zusammenfasst.
Die Lichtberechnung wird für jedes Level einmal durchgeführt, für eine Position der Lichtquelle und einen Einfallswinkel – dementsprechend ist die Beleuchtung in Gothic ziemlich statisch. Ob die Sonne aufgeht, hoch am Himmel steht, untergeht, ob es regnet oder der Mond scheint, das hat keinen Einfluss. Man kann es gut an den Schatten der Mauerreste erkennen:
Wenn die Beleuchtung sich also im Grunde nicht ändert, warum gibt es dann eindeutig erkennbare Tageszeiten? Die Antwort ist, dass Gothic beim Zeichnen der Faces einen Farbwert auf die Textur anwendet, welcher aus der Poly Light Color Lookup Table oder kurz CLUT entnommen wird. Dabei handelt es sich um eine Tabelle, welche mit jedem Frame neu berechnet wird und 256 unterschiedliche Abstufungen der aktuellen Farbe der globalen Lichtquelle enthält. Als Wert für den Lookup dient die Helligkeit des jeweiligen Vertex, welche zuvor vom Spacer berechnet wurde. So wird die Welt mittags gelblich, abends rötlich und nachts bläulich gefärbt.
Zu Testzwecken habe ich die CLUT mit reinweiß überschrieben:
Dadurch kamen die hellen Kiesel in dem Schutthaufen zwar besser zur Geltung, andererseits wurde dadurch die Schattierung ausgehebelt. Der nächste Schritt zur Verbesserung wäre also, die von Gothic berechneten Farbwerte in der CLUT so anzupassen, dass sie kontrastreicher und sättigungsärmer sind. Der übernächste Schritt könnte sein, mittels eines Union-Plugins die Beleuchtung zur Laufzeit des Spiels zu berechnen. Dazu ist es bisher aber nicht gekommen, stattdessen habe ich die CLUT mit Zufallswerten befüllt. 😂
Durch den Gothic I 3D+ Mesh-Patch von davied bin ich später darauf aufmerksam geworden, dass sich die Beleuchtung in Gothic auch noch anderweitig beeinflussen lässt. Wie man auf den Screenshots erkennen kann, werden die Schatten der Objekte weicher dargestellt. Doch wie hat er das geschafft?
Was bisher noch in keinem Artikel erwähnt wurde, sind die so genannten Materialien (Materials). Die Textur enthält nur die Bilddaten, die Eigenschaften werden im dazugehörigen Material gespeichert. Gothic 1 hat im Vergleich zu modernen Engines jedoch nur wenige und die meisten davon sind nicht von Bedeutung. Die Materialgruppe (Material Group / matGroup) steuert beispielsweise, welches Geräusch abgespielt wird, wenn der Spieler über eine Fläche mit diesem Material läuft. Ein Sonderfall dabei ist die Materialgruppe WATER. Wenn man sie verwendet, wird die Fläche halbtransparent dargestellt, die Kollisionsprüfung deaktiviert und der Spieler kann in ihr schwimmen. Neben weiteren Eigenschaften für animierte Texturen, bleibt noch eine von Interesse über: Der Glättungswinkel (Smoothing Angle / smoothAngle).
Dabei handelt es sich um den Schwellwert für den Winkel zwischen zwei Faces, welcher die Darstellung der Schatten beeinflusst. Ist der jeweilige Winkel darunter, wir die Kante weich dargestellt. Ist er darüber, wird sie hart dargestellt. In Gothic sind es übrigens standardmäßig 60°. Die folgenden Kugeln sind geometrisch komplett identisch, nur die Schatten werden anders dargestellt:
Wie man sieht, ist der Unterschied erheblich. Da er zudem keine Performance kostet, werden wir auch im Rahmen der Gothic Reloaded Mod davon Gebrauch machen. Der folgenden Vergleich aus der alten Mine demonstriert den Effekt in Gothic ganz gut, insbesondere in der rechten Bildhälfte. Mit den weicheren Schatten geht jedoch auch ein Verlust an Kontrast einher, wie man an den matt erscheinenden Felsvorsprüngen erkennen kann. Ingesamt wirkt die alte Mine damit zwar stimmiger, wir werden jedoch nicht umhin kommen, verschiedene Werte für den Smoothing Angle auszuprobieren.
Wenn ihr noch mehr über die technischen Details erfahren wollt, ist dieses Video von GuerillaCG einen Blick wert.