Mapping & Hammer

Eigene Texturen für GMod erstellen: VTF und VMT erklärt

Eigene Texturen für Hammer und GMod: Bild als VTF speichern, VMT schreiben, Dateien richtig unter materials ablegen und typische Fehler beheben.

Aus einem eigenen Bild wird eine Textur, indem du es als VTF speicherst und eine kleine Textdatei mit der Endung .vmt dazulegst, die das Material beschreibt. Beide Dateien gehören in einen Unterordner von garrysmod/materials/. Hammer und das Spiel arbeiten immer mit dem Material, also der VMT, und die verweist auf die VTF. Stimmen Bildgröße, Shader und Pfad, erscheint die Textur im Texture Browser und im Spiel.

Zwei Dateien: VTF und VMT

Die VTF (Valve Texture Format) enthält die Bilddaten: die Pixel und verkleinerte Fassungen für die Ferne, die Mipmaps. Die VMT ist ein Textskript. Sie legt fest, welcher Shader die Fläche zeichnet, welche Texturen er verwendet und wie sich die Oberfläche physikalisch verhält, etwa welches Schrittgeräusch sie macht.

Die Engine greift nicht direkt auf eine VTF zu, sondern immer über ein Material. Deshalb wählst du in Hammer Materialien aus und keine Bilddateien. Mehrere VMTs dürfen dieselbe VTF verwenden, zum Beispiel eine Fassung für Brushes und eine für Models.

Das Bild vorbereiten: Größe und Format

Breite und Höhe müssen jeweils eine Zweierpotenz sein, zum Beispiel 256, 512, 1024 oder 2048 Pixel, in der Regel höchstens 4096. Quadratisch muss das Bild nicht sein, 512 × 256 funktioniert. Speichere die Vorlage verlustfrei, etwa als TGA oder PNG. Ein JPG bringt Artefakte mit, die bei der Umwandlung noch einmal komprimiert werden.

Beim Speichern als VTF wählst du ein Bildformat. Vier davon decken fast alles ab:

FormatBits pro PixelAlphakanalGeeignet für
DXT14höchstens 1 Bitnormale, deckende Texturen
DXT58jaTexturen mit Transparenz
BGR88824neinsehr feine Verläufe, Normal Maps
BGRA888832jafeine Verläufe mit Alphakanal

Die DXT-Formate komprimieren mit Verlust, die anderen beiden nicht. Der Preis ist die Größe: Eine Textur mit 1024 × 1024 Pixeln belegt ohne Mipmaps als DXT1 ein halbes Megabyte, als BGR888 drei. Nimm deshalb DXT1 oder DXT5 als Standard und die unkomprimierten Formate nur dort, wo die Kompression sichtbar stört. Für Texturen in der 3D-Welt lässt du Mipmaps erzeugen.

Bild in eine VTF umwandeln

Zwei Wege sind üblich:

  • VTFEdit und seine Nachfolger. VTFEdit ist ein grafisches Programm. Über File > Import lädst du das Bild und stellst im Importdialog unter „Normal format“ und „Alpha format“ das Bildformat ein. Das Original wird laut Valve Developer Community nicht mehr gepflegt. Die Community führt es als VTFEdit Reloaded und VTFEdit++ weiter.
  • vtex. Das Kommandozeilenprogramm von Valve liegt bei GMod im Ordner bin. Es wandelt TGA-Dateien um und erwartet sie unter garrysmod/materialsrc/. Die VTF landet im gleichnamigen Unterordner von materials/. Einstellungen wie nocompress 1 stehen in einer Textdatei mit demselben Namen wie das Bild.

Achte beim Speichern auf die VTF-Version. Mit 7.4 oder älter bist du auf der sicheren Seite. Version 7.5 stammt aus einem neueren Engine-Zweig, und die Valve Developer Community sagt für GMod nur, dass die Unterstützung möglich ist.

Die VMT schreiben

Eine VMT erstellst du in jedem Texteditor. Das kleinste sinnvolle Material für eine Wand sieht so aus:

LightmappedGeneric
{
	$basetexture "meinname/meinemap/wand_beton01"
	$surfaceprop concrete
	%keywords "meinemap"
}

In der ersten Zeile steht der Shader, zwischen den Klammern folgt pro Zeile ein Parameter mit seinem Wert. Anführungszeichen brauchst du nur, wenn ein Wert Leerzeichen enthält. Diese Parameter brauchst du als Erstes:

  • $basetexture: der Pfad zur VTF, relativ zu materials/ und ohne Dateiendung.
  • $surfaceprop: die Oberflächenart, etwa concrete, metal, wood, dirt, glass oder tile. Sie bestimmt Schrittgeräusche, Einschusseffekte und weitere physikalische Eigenschaften.
  • $bumpmap: eine Normal Map, die der Fläche unter Licht Struktur gibt. Ergänzt du sie nachträglich, musst du die Map neu kompilieren, weil solche Flächen zusätzliche Lightmaps bekommen.
  • $envmap env_cubemap: Spiegelungen aus dem nächstgelegenen env_cubemap. Sie erscheinen erst, nachdem du die Cubemaps gebaut hast. Mehr dazu steht in Cubemaps und Reflexionen beheben.
  • $translucent 1 oder $alphatest 1: Beide nutzen den Alphakanal der Textur. $translucent erlaubt weiche Übergänge wie bei Glas, kann aber Sortierfehler zwischen hintereinanderliegenden Flächen erzeugen. $alphatest kennt nur sichtbar oder unsichtbar, ist deutlich schneller und passt zu Zäunen und Gittern.
  • %keywords: durch Kommas getrennte Stichwörter für das Feld „Keywords“ im Texture Browser von Hammer.

Ordner und Pfade

garrysmod/materials/meinname/meinemap/wand_beton01.vmt
garrysmod/materials/meinname/meinemap/wand_beton01.vtf
garrysmod/materials/meinname/meinemap/wand_beton01_normal.vtf

Der Name des Materials in Hammer ist der Pfad der VMT ab materials/, hier meinname/meinemap/wand_beton01. Wo die VTF liegt und wie sie heißt, ist technisch egal, solange $basetexture genau dorthin zeigt. Gleiche Namen sind nur die übliche Ordnung.

Zwei Regeln ersparen dir Ärger:

  1. Lege alles in einen eigenen Unterordner. So überschreibst du keine fremden Materialien und findest deine Dateien beim Packen wieder.
  2. Schreibe Ordner- und Dateinamen klein, ohne Leerzeichen und ohne Umlaute. Linux-Server unterscheiden Groß- und Kleinschreibung.

GMod lädt außerdem alles, was unter garrysmod/addons/<name>/materials/ liegt. Taucht ein neues Material im Texture Browser nicht auf, hilft in der Praxis ein Neustart von Hammer.

Brushes und Models: der richtige Shader

LightmappedGeneric ist für Brushes und Displacements gedacht. Diese Flächen bekommen ihr Licht aus den Lightmaps, die VRAD berechnet. VertexLitGeneric ist der Shader für Models, deren Licht pro Eckpunkt bestimmt wird.

Verwechselst du die beiden, stimmt das Licht nicht. Ein Material mit VertexLitGeneric auf einem Brush erkennst du laut Valve Developer Community daran, dass die Fläche komplett schwarz ist, flackert oder ihre Helligkeit mit dem Blickwinkel ändert. Deshalb gehören die Materialien aus dem Ordner models/ nicht auf Brushes. Umgekehrt können Models LightmappedGeneric nicht verwenden. Brauchst du dasselbe Bild auf einem Brush und auf einem Model, schreibst du zwei VMTs, die auf dieselbe VTF zeigen. Meist unterscheidet sich nur die erste Zeile.

Typische Fehler und ihre Ursache

SymptomUrsacheLösung
Pink-schwarzes SchachbrettDie VMT fehlt oder $basetexture zeigt auf keine VTFPfad ab materials/ und Schreibweise prüfen
Weißes DrahtgitterDer Shader in der ersten Zeile existiert nichtShadernamen korrigieren
Bei dir sichtbar, bei anderen nichtDie Dateien liegen nur auf deinem RechnerMaterial mit der Map ausliefern
Fläche schwarz oder flackerndVertexLitGeneric auf einem BrushLightmappedGeneric verwenden
Fläche leuchtet ohne SchattenShader UnlitGeneric, der ohne Lichtberechnung zeichnetShader wechseln
Falsches Schrittgeräusch$surfaceprop fehlt oder passt nichtpassenden Wert setzen

Ist nicht eine einzelne Fläche, sondern die ganze Map gleichmäßig hell, fehlen die Lichtdaten. Das behandelt der Artikel Source Engine Beleuchtung. Hast du eine VMT geändert, während das Spiel läuft, lädt der Konsolenbefehl mat_reloadmaterial mit dem Namen der VMT das Material neu.

Der Fall „bei anderen nicht sichtbar“ ist der häufigste. Eigene Materialien existieren nur in deinem Spielordner, bis du sie mitlieferst. Wie das geht, steht in Custom Content in die BSP packen, und die Fehlersuche aus Sicht der Spieler in Fehlende Texturen und ERROR-Models beheben. Verwende nur Bilder, an denen du die nötigen Rechte hast: eigene Fotos und Grafiken oder Vorlagen, deren Lizenz die Weitergabe erlaubt. Die Grundlagen stehen in Urheberrecht bei GMod-Maps.

Häufige Fragen

Welche Auflösung sollte eine Textur haben?

Das hängt von der Fläche ab. Hammer legt neue Texturen mit der Skalierung 0,25 auf, ein Pixel bedeckt also eine Viertel-Unit, und eine 512 Pixel breite Textur wiederholt sich alle 128 Units. Höhere Auflösungen wirken aus der Nähe schärfer, kosten aber Speicher und Dateigröße.

Wie mache ich einen Zaun oder ein Gitter durchsichtig?

Das Bild braucht einen Alphakanal, in dem die Lücken schwarz sind, und die VTF ein Format, das ihn speichert, in der Regel DXT5. In die VMT schreibst du $alphatest 1. Das Beispiel der Valve Developer Community setzt zusätzlich $alphatestreference 0.5 als Schwelle zwischen sichtbar und unsichtbar. Soll die Fläche von beiden Seiten zu sehen sein, ergänzt du $nocull 1.

Braucht jede Textur eine Normal Map?

Nein. Ein Material funktioniert mit $basetexture und $surfaceprop. Eine Normal Map kostet eine weitere VTF, und Flächen mit $bumpmap bekommen vier Lightmaps statt einer. Sie lohnt sich dort, wo Streiflicht Struktur zeigen soll.