GtkRadiant logo

Quake 3 Radiant – Verbesserter Skybox Shader

Last Updated on 19. March 2022 by Victor Karp

Im Tutorial über Skyboxen mit Terragen habe ich euch gezeigt, wie ihr eine Skybox mit Terragen erstellen könnt und dafür diesen Shader benutzt:

textures/skies/terragensky
{
	qer_editorimage env/skybox_up.jpg
	q3map_lightimage textures/common/white.tga
        surfaceparm nodlight
        surfaceparm noimpact
	surfaceparm nolightmap
	surfaceparm nomarks
	q3map_surfacelight 80
	q3map_sun 1 1 1 80 249 10
	skyParms env/skybox - -
}

Dabei handelt es sich um die alte Methode, die benutzt wurde, als Quake 3 released wurde. Das Problem dabei ist die Zeile q3map_surfacelight. Sie sorgt dafür, dass die Skyboxoberflächen Licht wie eine normale Lampentextur abgeben. Dieses Licht wird auf Distanz schwächer. Flächen, die sich näher an der Skybox befinden, werden stärker beleuchtet als solche, die weiter weg sind.

Der Compiler wurde seit dem Release von Quake 3 weiterentwickelt und kann Licht inzwischen wesentlich realistischer berechnen. Ich zeige euch die neuen Funktionen anhand eines Shaders, den ich für die Skybox von Shibam verwendet habe.

textures/shibam/skybox
{
    qer_editorimage textures/shibam/skybox.tga
    q3map_lightimage textures/shibam/skybox.tga
    surfaceparm nodlight
    surfaceparm noimpact
    surfaceparm nolightmap
    surfaceparm nomarks
    skyParms env/shibam 128 -
    q3map_sunExt 242 135 83 40 217 8 1 32
    q3map_lightmapFilterRadius 0 16
    q3map_skylight 25 6
}

Die letzten drei Zeilen enthalten neue Befehle. Wir werden auch einen erneuten Blick auf q3map_lightimage werfen. Diesen Befehl gab es vorher schon, aber der neue Shader hat eine andere Verwendung für ihn. Außerdem fehlen das erwähnte q3map_surfacelight sowie q3map_sun.

Fangen wir bei q3map_sunExt an. Die ersten drei Nummern stehen für die RGB Werte der Lichtfarbe. Diese lassen sich ermitteln, indem man ein neues light Entity erstellt und auf der rechten Seite im Farbmenü ([K]-Taste) die drei Werte abliest. Die nächste Zahl, im Beispielshader 40, gibt die Lichtstärke an. Die folgende Zahl (217) bestimmt die Himmelsrichtung, aus der das Licht kommt. Gerechnet wird in Grad. Die Messung des Winkels beginnt im Osten bei 0° und setzt sich gegen den Uhrzeigersinn fort (Norden 90° usw.). Die nächste Zahl gibt den Einfallswinkel an. Eine 0 entspricht einer am Horizont aufgehenden Sonne, 90 ist Mittagszeit.

Die beiden neuen Zahlen, 1 und 32, geben die Stärke der Schattenunschärfe (erste Zahl) und die Menge an Verwaschungen (zweite Zahl) an. Dazu ein paar Beispielbilder mit verschiedenen Werten:

Widmen wir uns nun der Zeile q3map_skylight. Auf den fünf Bildern oben wurde diese Zeile bereits benutzt, allerdings mit der Einstellung 60 6 (anstatt 25 6 wie im Beispielshader). Hätte ich sie ganz weggelassen, sähen die Bilder so aus:

q3map_skylight sorgt für zusätzliche gleichmäßige Beleuchtung aus mehreren Richtungen. Die erste Zahl gibt die Lichtstärke an, die zweite die Anzahl der Richtungen, aus denen beleuchtet wird. Die Zahl für die Richtungen ist nicht als direkte Mengenangabe zu verstehen.

Die Zeile q3map_lightmapFilterRadius glättet harte Schattenkanten. Ich werde gleich auf sie eingehen und lasse die Funktion auf den folgenden Bildern erst einmal weg, damit ihr die Wirkungsweise von q3map_skylight besser sehen könnt.

Mit q3map_lightmapFilterRadius lassen sich Schatten mit dem Gaußschen Weichzeichner verwaschen. Die beiden Werte, im Beispiel 0 und 16, geben dabei die Weichzeichnung der Textur selbst (self) und die Weichzeichnung aller Oberflächen, die von ihr beleuchtet werden (other), an. Da die Skyboxtextur keine Lightmap hat, also weder Licht noch Schatten empfängt, steht der self-Wert auf 0. Mit einem Wert von 16 für other lassen sich in Kombination mit q3map_skylight folgende Ergebnisse erzielen:

Das erste Bild sieht mit Filter zwar immer noch unschön, aber deutlich besser als vorher aus. Die Qualität der Schatten im zweiten Bild war allerdings vorher schon überlegen und wird durch den Filter noch weiter verbessert. Das Endergebnis ist rundum zufriedenstellend.

WICHTIG: die Zeile q3map_lightmapFilterRadius bezieht sich immer auf alle folgenden Zeilen. In diesem Fall ist das q3map_skylight. q3map_sunExt steht davor und ist nicht vom Filter betroffen. Diese Reihenfolge macht Sinn, da q3map_sunExt selbst auch schon für einen Weichzeichnungseffekt sorgt und deshalb nicht weiter verwaschen werden sollte.

Nun fehlt uns noch ein Befehl, der schon in Tutorial 28 benutzt wurde, aber dort eine andere Funktion hatte: q3map_lightimage. Vorher wurde die angegebene Textur für die Farbe des Surfacelights der Skyboxoberflächen benutzt. Jetzt bestimmt die Bilddatei, auf die diese Zeile weist, welche Farbe das von q3map_skylight abgegebene Licht hat. Ich habe mir für diesen Zweck eine kleine einfarbige Bilddatei in einem blassen Dunkelblau erstellt. Solltet ihr in eurem Shader auf eine mehrfarbige Textur verweisen, wird der Durchschnittsfarbwert ermittelt und als Lichtfarbe benutzt.

WICHTIG: Die Anzahl der Richtungen, aus denen q3map_skylight beleuchten soll, kann theoretisch auf höhere Werte als 6 eingestellt werden. Ich würde das nicht empfehlen, da 6 sehr gute Ergebnisse liefert und noch größere Zahlen die Compilezeit in die Höhe treiben. Das gilt auch für die Anzahl der Wiederholungen bei q3map_sunExt. 32 sollten ausreichend sein, größere Zahlen vermatschen die Schatten eher. Was q3map_lightmapFilterRadius angeht, hat sich ein Wert von 16 in meinen Versuchen bewährt. Wer mag, kann größere Zweierpotenzen ausprobieren. Allerdings schlägt sich auch das wieder in zusätzlicher Compilezeit nieder.

Abschließend möchte ich an dieser Stelle auf den Artikel “skies” im q3map2 shader manual hinweisen, dem ich die Funktionsweise dieser Shader entnommen habe und welcher Vorlage für mein deutschsprachiges Tutorial war.

Besuche die Quake 3 Mapping Tutorial Hauptseite für weitere Tutorials.

Scroll to top