GtkRadiant logo

Quake 3 Radiant – Einstieg in Shader

Last Updated on 19. March 2022 by Victor Karp

Was ist ein Shader?

Shader werden immer dann benötigt, wenn eine Textur mehr sein soll als nur ein Standbild. Mit einem Shader lassen sich Effekte wie Transparenz, Bewegung, Spiegelung, Verformung oder Materialeigenschaften konfigurieren.

Der Shader selbst ist Text in einer einfachen Textdatei, die das Spiel versteht und umsetzt. Die im Spiel verwendeten Shaderdateien befinden sich im Ordner baseq3/scripts. Sie haben die Endung .shader. Damit eine Shaderdatei vom Spiel erkannt wird, muss ihr Name in die shaderlist.txt eingetragen werden, die sich auch im scripts Ordner befindet. In einer einzelnen Shaderdatei befinden sich mehrere Shader.

Was benötige ich zum Erstellen eines Shaders?

Einen einfachen Texteditor und das Wissen um die Befehle, die benutzt werden können. Da es sehr mühsam und anfangs durch kleine Fehler enorm schwierig ist, einen funktionierenden Shader selbst zu schreiben, rate ich dazu, das Tool Q3ASE (Quake 3 Arena Shader Editor) zu benutzen. Dazu im nächsten Tutorial mehr.

Der Aufbau eines Shaders

Shader folgen genau einzuhaltenden Regeln und Reihenfolgen. Hier seht ihr den Shader der Metallgerüsttextur base_support/x_support2.

Die Zahlen links gehören nicht zum Shader, dabei handelt es sich um Zeilenangaben. Die Einschübe am Zeilenanfang dienen nur der besseren Lesbarkeit.

01 textures/base_support/x_support2
02 {
03    surfaceparm metalsteps    
04    surfaceparm trans    
05    surfaceparm alphashadow
06    surfaceparm playerclip
07    surfaceparm nonsolid
08    surfaceparm nomarks    
09    cull none
10    nopicmip
11       {
12          map textures/base_support/x_support2.tga
13          blendFunc GL_ONE GL_ZERO
14          alphaFunc GE128
15          depthWrite
16          rgbGen identity
17       }
18       {
19          map $lightmap
20          rgbGen identity
21          blendFunc GL_DST_COLOR GL_ZERO
22          depthFunc equal
23       }
24 }
  • Zeile 1: Name und Pfad der Textur. Diese Zeile gibt an, in welchem Ordner die Textur im Radiant zu finden sein soll und wie ihr Name lautet
  • Zeile 2: Die geöffnete geschweifte Klammer gibt an, dass jetzt der eigentliche Inhalt des Shaders kommt. Sie wird in Zeile 24 wieder geschlossen und schließt den Shader damit ab
  • Zeile 3-8: mehrere surfaceparms ( = Oberflächenparameter). Diese Angaben definieren die Eigenschaften des Brushes, auf dem die Textur liegt
  • Zeile 9: cull none bedeutet, dass die Textur auch sichtbar ist, wenn man den Brush von der Rückseite betrachtet. Normalerweise wird sie dann unsichtbar (das gleiche Verhalten wie bei der Rückseite von Patches)
  • Zeile 10: nopicmip bewirkt, dass diese Textur auch bei niedrig eingestellten Texturdetails immer mit maximalen Details dargestellt wird
  • Zeile 11: Hier wird der erste Texturblock geöffnet. Er schließt sich in Zeile 17
  • Zeile 12: Der Befehl map gefolgt vom Pfad einer Textur samt Dateiendung gibt eine Textur an, die verwendet werden soll. In diesem Fall ist es das Gerüst oben auf dem Bild
  • Zeile 13: blendFunc GL_ONE GL_ZERO heißt übersetzt “stell die Textur dar” und könnte auch weggelassen werden, da es die normale Darstellungsmethode ist
  • Zeile 14: Dieser Befehl steuert die Darstellung der Alphakanäle. Die Gittertextur hat einen unsichtbaren Kanal, der die Transparenz kontrolliert. Zeile 14 aktiviert diesen Kanal und ermöglicht es, an manchen Stellen durch die Textur zu sehen
  • Zeile 15: depthwrite ist wegen des verwendeten Befehls alphaFunc nötig, damit es bei der Darstellung der Schatten keine Probleme gibt
  • Zeile 16: Sollte in jeder Texturebene mit angegeben werden. Ohne diesen Befehl zeigt r_overbrightbits 1 keine Wirkung auf der Textur (siehe Tutorial 19 => r_overbrightbits)
  • Zeile 18: Hier wird der zweite Texturblock geöffnet. Er schließt sich in Zeile 23
  • Zeile 19: map $lightmap sagt dem Shader, dass hier die Lightmap konfiguriert wird (siehe Tutorial 19 => r_lightmap)
  • Zeile 21: Diese blendFunc bewirkt, dass die Lightmap wie ein Filter über die eigentliche Textur gelegt wird. Eine ebenfalls gültige Schreibweise ist  blendFunc filter
  • Zeile 22: Wird aus dem gleichen Grund wie Zeile 15 benötigt

Ich werde euch im folgenden Tutorial zeigen, wie ihr Q3ASE dazu verwenden könnt, alle Shader des Spiels komfortabel anzusehen, zu modifizieren und euch das Ergebnis in Echtzeit anzeigen zu lassen.

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

Scroll to top