Créer des textures custom pour GMod : VTF et VMT expliqués
Textures custom pour Hammer et GMod : enregistrer l’image en VTF, écrire le VMT, ranger les fichiers sous materials et corriger les erreurs typiques.
Ta propre image devient une texture quand tu l’enregistres en VTF et que tu y ajoutes un petit fichier texte .vmt qui décrit le matériau. Les deux fichiers vont dans un sous-dossier de garrysmod/materials/. Hammer et le jeu travaillent toujours avec le matériau, c’est-à-dire le VMT, qui pointe vers le VTF. Avec la bonne taille d’image, le bon shader et le bon chemin, la texture apparaît dans le Texture Browser et en jeu.
Deux fichiers : VTF et VMT
Le VTF (Valve Texture Format) contient les données de l’image : les pixels et les mipmaps, des versions réduites utilisées à distance. Le VMT est un script texte. Il définit quel shader dessine la surface, quelles textures il utilise et comment la surface se comporte physiquement, par exemple son bruit de pas.
Le moteur n’accède pas directement à un VTF, seulement par l’intermédiaire d’un matériau. C’est pour ça que tu choisis des matériaux dans Hammer, pas des fichiers image. Plusieurs VMT peuvent utiliser le même VTF, par exemple un pour les brushes et un pour les modèles.
Préparer l’image : taille et format
La largeur et la hauteur doivent chacune être une puissance de deux, par exemple 256, 512, 1024 ou 2048 pixels, normalement 4096 au maximum. L’image n’a pas besoin d’être carrée, 512 × 256 fonctionne. Enregistre l’image source sans perte, par exemple en TGA ou en PNG. Un JPG apporte des artefacts qui sont compressés une seconde fois lors de la conversion.
Au moment d’enregistrer en VTF, tu choisis un format d’image. Quatre d’entre eux couvrent presque tout :
| Format | Bits par pixel | Canal alpha | Convient pour |
|---|---|---|---|
| DXT1 | 4 | 1 bit au maximum | textures opaques ordinaires |
| DXT5 | 8 | oui | textures avec transparence |
| BGR888 | 24 | non | dégradés très fins, normal maps |
| BGRA8888 | 32 | oui | dégradés fins avec canal alpha |
Les formats DXT compressent avec perte, les deux autres non. Le prix à payer, c’est la taille : sans mipmaps, une texture de 1024 × 1024 occupe un demi-mégaoctet en DXT1 et trois en BGR888. Prends donc DXT1 ou DXT5 par défaut et n’utilise les formats non compressés que là où la compression gêne visiblement. Pour les textures du monde 3D, fais générer des mipmaps.
Convertir l’image en VTF
Deux méthodes sont courantes :
- VTFEdit et ses successeurs. VTFEdit est un programme graphique. Tu charges l’image via
File > Importet tu règles le format dans la fenêtre d’import, sous « Normal format » et « Alpha format ». D’après la Valve Developer Community, l’original n’est plus maintenu. La communauté en poursuit le développement sous les noms VTFEdit Reloaded et VTFEdit++. - vtex. Le programme en ligne de commande de Valve est fourni avec GMod dans le dossier
bin. Il convertit des fichiers TGA et les attend sousgarrysmod/materialsrc/. Le VTF atterrit dans le sous-dossier du même nom sousmaterials/. Les réglages commenocompress 1vont dans un fichier texte portant le même nom que l’image.
Fais attention à la version du VTF à l’enregistrement : la 7.4 ou une version plus ancienne est le choix sûr. La version 7.5 vient d’une branche plus récente du moteur, et pour GMod la Valve Developer Community dit seulement que la prise en charge est possible.
Écrire le VMT
N’importe quel éditeur de texte permet de créer un VMT. Le plus petit matériau de mur qui ait du sens ressemble à ceci :
LightmappedGeneric
{
$basetexture "myname/mymap/wall_concrete01"
$surfaceprop concrete
%keywords "mymap"
}
La première ligne nomme le shader, et chaque ligne entre les accolades contient un paramètre et sa valeur. Les guillemets ne sont nécessaires que si une valeur contient des espaces. Voici les paramètres dont tu as besoin en premier :
$basetexture: le chemin vers le VTF, relatif àmaterials/et sans extension de fichier.$surfaceprop: le type de surface, par exempleconcrete,metal,wood,dirt,glassoutile. Il détermine les bruits de pas, les effets d’impact de balle et d’autres propriétés physiques.$bumpmap: une normal map qui donne du relief à la surface sous la lumière. Si tu l’ajoutes après coup, recompile la map, car ces surfaces reçoivent des lightmaps supplémentaires.$envmap env_cubemap: des reflets issus de l’env_cubemaple plus proche. Ils n’apparaissent qu’une fois les cubemaps générées. Plus de détails dans l’article corriger les reflets des cubemaps.$translucent 1ou$alphatest 1: les deux utilisent le canal alpha de la texture.$translucentpermet des transitions douces comme sur du verre, mais peut produire des erreurs de tri entre des surfaces qui se chevauchent.$alphatestne connaît que visible ou invisible, est nettement plus rapide et convient aux clôtures et aux grilles.%keywords: des mots-clés séparés par des virgules pour le champ « Keywords » du Texture Browser de Hammer.
Dossiers et chemins
garrysmod/materials/myname/mymap/wall_concrete01.vmt
garrysmod/materials/myname/mymap/wall_concrete01.vtf
garrysmod/materials/myname/mymap/wall_concrete01_normal.vtf
Le nom du matériau dans Hammer est le chemin du VMT à partir de materials/, ici myname/mymap/wall_concrete01. L’emplacement du VTF et son nom n’ont techniquement aucune importance, tant que $basetexture pointe dessus. Des noms identiques ne sont que la convention habituelle.
Deux règles t’épargnent des ennuis :
- Mets tout dans un sous-dossier à toi. Comme ça, tu n’écrases les matériaux de personne d’autre et tu retrouves tes fichiers au moment du packing.
- Écris les noms de dossiers et de fichiers en minuscules, sans espaces ni caractères spéciaux. Les serveurs Linux distinguent les majuscules des minuscules.
GMod charge aussi tout ce qui se trouve sous garrysmod/addons/<name>/materials/. Si un nouveau matériau n’apparaît pas dans le Texture Browser, redémarrer Hammer aide en pratique.
Brushes et modèles : le bon shader
LightmappedGeneric est prévu pour les brushes et les displacements. Ces surfaces sont éclairées par les lightmaps que calcule VRAD. VertexLitGeneric est le shader des modèles, dont la lumière est déterminée par sommet.
Si tu confonds les deux, l’éclairage est faux. D’après la Valve Developer Community, un matériau VertexLitGeneric sur un brush se présente comme une surface qui est entièrement noire, qui scintille ou dont la luminosité change avec l’angle de vue. C’est pour ça que les matériaux du dossier models/ n’ont pas leur place sur des brushes. À l’inverse, les modèles ne peuvent pas utiliser LightmappedGeneric. Pour la même image sur un brush et sur un modèle, écris deux VMT qui pointent vers le même VTF. En général, seule la première ligne diffère.
Erreurs typiques et leur cause
| Symptôme | Cause | Solution |
|---|---|---|
| Damier rose et noir | Le VMT manque ou $basetexture ne pointe vers aucun VTF | Vérifie le chemin à partir de materials/ et l’orthographe |
| Fil de fer blanc | Le shader de la première ligne n’existe pas | Corrige le nom du shader |
| Visible chez toi, pas chez les autres | Les fichiers n’existent que sur ta machine | Livre le matériau avec la map |
| Surface noire ou qui scintille | VertexLitGeneric sur un brush | Utilise LightmappedGeneric |
| La surface brille sans ombres | Shader UnlitGeneric, qui dessine sans éclairage | Change de shader |
| Mauvais bruit de pas | $surfaceprop manque ou ne convient pas | Définis une valeur adaptée |
Si c’est toute la map qui est uniformément claire et pas seulement une surface, il manque les données d’éclairage. C’est traité dans le guide d’éclairage du Source Engine. Si tu as modifié un VMT pendant que le jeu tourne, la commande console mat_reloadmaterial suivie du nom du VMT le recharge.
Le cas « pas visible chez les autres » est le plus fréquent. Les matériaux custom n’existent que dans ton dossier de jeu tant que tu ne les livres pas. La marche à suivre est décrite dans packer du contenu custom dans un BSP, et le côté joueur dans corriger les textures manquantes et les modèles ERROR. N’utilise que des images dont tu détiens les droits : tes propres photos et créations graphiques, ou des sources dont la licence autorise la redistribution. L’essentiel est expliqué dans les bases du droit d’auteur pour les maps GMod.
Questions fréquentes
Quelle résolution une texture doit-elle avoir ?
Ça dépend de la surface. Hammer applique les nouvelles textures à une échelle de 0,25 : un pixel couvre donc un quart d’unité, et une texture de 512 pixels de large se répète toutes les 128 unités. Des résolutions plus élevées paraissent plus nettes de près, mais coûtent de la mémoire et de la taille de fichier.
Comment rendre une clôture ou une grille transparente ?
L’image a besoin d’un canal alpha dans lequel les vides sont noirs, et le VTF d’un format qui le stocke, en général DXT5. Dans le VMT, tu écris $alphatest 1. L’exemple de la Valve Developer Community définit aussi $alphatestreference 0.5 comme seuil entre visible et invisible. Si la surface doit être visible des deux côtés, ajoute $nocull 1.
Chaque texture a-t-elle besoin d’une normal map ?
Non. Un matériau fonctionne avec $basetexture et $surfaceprop. Une normal map coûte un VTF de plus, et les surfaces avec $bumpmap reçoivent quatre lightmaps au lieu d’une. Elle vaut le coup là où une lumière rasante doit révéler le relief.