41 | Einstieg in Shader

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.

Dieser Beitrag wurde unter Tutorials abgelegt und mit , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

4 Antworten zu 41 | Einstieg in Shader

  1. Tino schreibt:

    Ich bin fasziniert wie du das alles hier hinbekommst und sehr sehr stolz darauf, dass Jemand soviel Zeit hat. Kenne übelst viele Seiten zum Mappen z.B DarthArts, ws.q3df.org hardirki und und und und und aber diese Site is sowas von der Hammer und lehrreich.

    Danke dir!

  2. Victor Karp schreibt:

    Vielen Dank 🙂 Ich hab im Moment leider nicht mehr so viel Zeit zum Schreiben, aber die Tutorialserie wird auf jeden Fall noch weiter fortgesetzt. Es fehlen noch einige wirklich coole Dinge, die ich bisher nicht behandelt habe. Die kommen, wenn die Grundtutorials zum Thema Shader abgehakt sind. Tutorial 42 wird bald veröffentlicht, da wird die Shadererstellung noch etwas konkreter erklärt.

    • Tino schreibt:

      Bin hauptsächlich nur am Mappen da es unglaublich spass macht das Bildliche im Gehirn anderen Leute zu zeigen und diese in meinem Gehirnkomplex teilhaben zu lassen (auch wenns kein Geld gibt). Motivierend ist wie du alles auf die Beine bringst und so viel wie möglich aus der Engine und shaders rausholst.

      Habe für Jedi Knight 2 gemappt nun hat mich DeFRaG fasziniert und arbeite für die Community. Dennoch hab ich hier und da Anfängerprobleme wie z.B Leute von anfang der Map keine Waffen zu erlauben bis ein triggerbrush ihnen die zuweist. evtl kannst du mir da helfen.

      Dank im Voraus.

      P.S Deine Arbeit wird sehr geschäzt.

      • Victor Karp schreibt:

        Hast du Tutorial 27 schon gelesen? Das sollte genau das sein, was du suchst. Defragspezifische Tipps kann ich dir leider nicht geben, weil ich die Mod nicht spiele und somit auch keine Erfahrung damit habe. Ich meine aber, dass es für Defrag eigene Entitydefinitionen für den Radiant gibt, die einige Funktionen hinzufügen (wie etwa Start- und Ziellinie).

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s