Tuto complet sur les shaders

Un article de Wiki-Mapping.

Jump to: navigation, search

Q3Radiant Shader Manual

Sommaire

[modifier] Preface: Faire ses propres shaders

Le manuel destiné à l'éditeur Q3Radiant contient une section nommée "Créer de nouveaux outils" avec les informations nécessaires permettant de créer ses propres shaders pour Quake III Arena. Il est recommandé d'étudier les scripts de ce document ainsi que ceux des fichiers shaders. Il faut faire particulièrement attention à la syntaxe et à la ponctuation. C'est sur c'est points que vous êtes le plus à même de faire des erreurs.

[modifier] Introduction

Le moteur graphique de Quake III Arena est un bond en avant dans la mesure ou il permet de contrôler de façon plus directe les propriétés des textures manipulées. En écrivant ce manuel (NdT: Pas, moi :p), nous avons essayé de définir les concepts et outils qui sont utilisés pour modifier les textures de telle sorte que, nous l'espérons, ce soit accessible aux utilisateurs qui ont déjà les connaissances de base en graphismes sur ordinateurs sans pour autant être des programmeurs.

[modifier] Qu'est-ce qu'un shader?

Les shaders sont de cours textes définissant les propriétés des surfaces telles qu'elles sont visibles et fonctionnent dans le jeu (ou un quelconque éditeur). Il est d'usage que les documents contenant ces scripts aient le même nom que le groupe de textures que l'on veut modifier (ex.: base, hell, castle, etc...). Plusieurs scripts particuliers ont également été créés pour prendre en charge certaines caractéristiques particulières comme pour les liquides, les ciels et les effets spéciaux.

Pour Quake III Arena, les shaders sont situés dans quake3/baseq3/scripts. (NdT : Pour ET, etmain/scripts/)

Un shader pour Quake III Arena consiste en une série d'attributs ou d'instructions décrivant le rendu, le tout encapsulé entre des accolades ( "{" et "}" ). Vous pouvez voir ci-dessous un exemple simple de shader qui attribue une unique propriété, avec un mot-clé de Q3MAP ("SurfaceParameters"), qui suit la première accolade, ainsi qu'une unique "étape" entre accolades:

textures/liquids/lava
	{
	deformVertexes wave sin 0 3 0 0.1
	tessSize 64
	{
	map textures/common/lava.tga
	}
}

[modifier] Nom du shader & conventions sur les fichiers

La première ligne est le nom du shader. Ce nom peut contenir jusqu'à 63 caractères. Il correspond le plus souvent à l'emplacement du fichier .tga privé de son extension et du chemin de base (/quake3/baseq3 dans notre cas (NdT : pour ET : /Wolfenstein - Enemy Territory/etmain/)), mais cela n'est pas obligatoire.

Les shaders destinés à être uniquement interprétés par le jeu, pas par les outils d'édition, sont le plus souvent réduits à un simple mot, comme "projectionShadow" or "viewBlood".

Les shaders qui sont utilisés sur les personnages ou les polygones des divers models doivent correspondre à un fichier .tga, ce qui permet la création de textures normales, tout en ayant par la suite les effets spéciaux qui apparaissent lorsque le model est chargé dans le jeu.

Les shaders sont placés sur les surfaces dans l'éditeur, et font généralement référence à un fichier .tga, mais le paramètre "qer_editorimage" permet d'obliger l'éditeur à utiliser une image particulière pour l'aperçu.

Les chemins des shaders peuvent poser des problèmes de casse - sous windows, ils ne sont pas sensibles à la casse, mais c'est le cas sous unix. Il est préférable de toujours utiliser des minuscules pour les noms de dossiers et des slashes "/" afin de séparer les dossiers.

[modifier] Les types de shaders

Les mots clé définissant les propriétés des shaders se répartissent en deux catégories. La première catégorie de mots clés se correspond à une partie des paramètres globaux. Certains paramètres globaux ("surfaceparms" Ainsi que tous les mots clé de la forme "q3map_" ) sont interprétés par Q3MAP, et changent les caractéristiques physiques des surfaces utilisant le shader. Ces caractéristiques peuvent affecter le joueur. Pour voir les changements au niveau de ces paramètres, il est nécessaire de recompiler la map (au moins le BSP).

Les autres mots clé globaux ainsi que ceux définissant des étapes particulières sont générées par le moteur du jeu. Les changements dus à ces paramètres ne concernent que l'apparence, et n'ont aucun effet sur le gameplay ou le fonctionnement du jeu. Une modification de n'importe lequel de ces attributs est visible grace à un simple démarrage du jeu ou un vid_restart (taper la commande /vid_restart dans la console).

Ces mots clé ne sont pas sensibles à la casse.

NOTE IMPORTANTE: certaines commandes peuvent dépendre de l'ordre dans lequel elles sont utilisées, c'est pourquoi il est recommandé de placer toutes les caractéristiques à caractère global (ceux définis dans cette partie) au tout début du shader, et de placer les différentes étapes du shader à la fin (voir les exemples).

[modifier] Concepts clés

Idéalement, un designer/artiste qui manipule des textures avec des shaders associés a des connaissances de base relatives aux fonctions physiques périodiques de base et aux mélanges des lumières de couleurs (le genre de choses que l'on voit en physique à l'école). Sinon, il y a quelques concepts qu'il vous faut saisir afin de faire ce que voulez des shaders.

[modifier] Effets de surface, effets sur le contenu et effets de déformation

Les shaders ne se contentent pas de modifier l'aspect des textures sur la géométrie d'un brush, d'une courbe, d'un patch ou d'un model, mais ils peuvent également avoir des effets sur le contenu, la forme, et l'impression de mouvement de ces choses. Un effet sur une surface ne modifie pas la forme ou le contenu d'un brush. Les effets de surface englobent les brillances, les transparences, et les changement de couleurs rgb (rouge vert bleu). Les shaders modifiant le contenu changent la façon dont le brush se comporte dans le jeu. En font partie les shaders pour l'eau, le brouillard et ceux qui ne sont pas solides. Les effets de déformation modifient la forme du brush ou de la courbe, et donnent une impression de mouvement.

[modifier] La puissance à un prix

Les shaders donnent au designer, à l'artiste et au programmeur un panel d'outils faciles à utiliser pour contrôler l'apparence et les effets spécieux applicables aux surfaces dans le jeu. Mais ces possibilités ont un prix, et ce prix se mesure en performance d'affichage. Chaque processus d'un shader affectant l'apparence oblige le moteur du jeu à faire de nouveau calculs et à redessiner l'environnement. Il faut imaginer que vous ajoutiez l'ensemble des triangles affectés par un shader à la valeur totale du r_speed pour chaque étape de ce shader. Une texture modifiée par un shader qui est vue au travers d'une autre texture ainsi modifiée (comme une lumière au travers du brouillard) à pour effet d'ajouter leur "nombre d'étapes fois" la quantité de triangles que les shaders affectent. Une lumière demandant deux étapes pour son rendu, vue au travers d'un brouillard nécessitant une étape, sera traitée comme s'il fallait dessiner la partie du jeu affectée par la lumière trois fois.

[modifier] Couleurs RGB

RGB signifie "Rouge, Vert, Bleu" (Red, Green, Blue). Mélanger des lumières de ces trois couleurs avec des intensités différentes crée les couleurs visibles sur les ordinateurs et les télévisions. C'est appelé l'additivité des couleurs (par opposition au mélange des pigments en peinture ou au mélange des encres en imprimerie, ou il s'agit de soustractions). Dans Quake III Arena (NdT : comme dans ET) ainsi que les programmes d'édition d'images (et dans la palette de couleurs de Windows), l'intensité du Rouge, du Vert et du Bleu sont exprimés en tant que nombre entiers. Une fois mélangés sur l'écran, les mêmes valeurs d'intensité pour les 3 couleurs donnent une couleur totalement neutre (gris). Plus une valeur est petite (vers 0), plus le ton est sombre. Plus la valeur est grande, plus le ton est clair ou la couleur est saturée jusqu'à la valeur maximum de 255 (dans les éditeurs d'images). Toutes les couleurs d'un écran peuvent s'exprimer comme une formule de trois entiers. La valeur du noir est 0 0 0. La valeur du blanc est 255 255 255. Cependant, le moteur graphique de Quake III Arena (NdT : ou ET) nécessite une normalisation dans l'intervalle de valeurs situées entre 0.0 et 1.0

[modifier] Normalisation : une échelle de 0 à 1

Les calculs dans Quake III Arena (NdT : comme dans ET) utilisent une échelle de 0.0 à 1.0 au lieu de 0 à 255. La plupart des éditeur d'image peuvent exprimer les couleurs RGB comme des triplets sur l'échelle allant de 0 à 255. Afin de convertir ces valeurs, il faut diviser la valeur de chacune des trois composantes par 255. Les valeurs résultantes sont celles correspondant à la même couleur pour Quake III Arena (NdT : ou pour ET). La même chose est encore vrai pour les coordonnées des textures.

[modifier] La taille des textures

Les textures au format TGA sont mesurées en pixels (picture elements). Les textures sont mesurées sur la base de puissances de 2, ou 16x16 pixels est typiquement la plus petite texture à utiliser. La plupart seront plus grandes. Les textures n'ont pas besoin d'être carrées du moment que chaque dimension correspond à une puissance de 2. Par ex. : 32x256, 16x32, 128x16.

[modifier] Mathématiques des couleurs

Dans Quake III Arena, les couleurs sont modifiées par le biais d'équations mathématiques appliquées aux textures par le biais de scripts ("programlets") dans le shader. Une équation qui ajoute ou multiplie les nombres dans une texture la fait devenir plus sombre. Les équations qui soustraient ou modulent ces nombres éclaircissent la texture. Ces équations permettent également de changer le ton ou la saturation d'une couleur.

[modifier] Mesures

Les grandeurs utilisées dans les shaders sont soit des unités du jeu, des unités de couleur ou encore des unités de texture.

Une unité du jeu : Il s'agit d'une unité utilisée pour spécifier la taille des déformations. Les unités du jeu sont à une échelle qui remonte à l'époque de Wolfenstein - 8 unités valent un pied (NdT ~30,5 cm). La taille de texture par défaut utilisée par l'éditeur Q3Radiant est de deux texels pour chaque unité, mais cela peut être librement changé.

Une unité de couleur : Les couleurs se basent sur les valeurs générées par les unités de texture pour produire les effets de lumière. Une valeur de 0.0 est totalement noire, et une valeur de 1.0 laisse la texture inchangée. Les couleurs sont parfois associées à une unique valeur destinée à être utilisée à la fois pour le rouge, le vert et le bleu, ou se composent d'autres fois d'une valeur pour chaque couleur.

Une unité de texture : Ce sont les dimensions normalisées (voir ci-dessus) d'une texture (ou d'une image modifiée au préalable par une certaine étape d'un shader). Une texture complète, sans tenir compte de sa taille originale en texels, à une dimension normalisée de 1.0 x 1.0. Pour les textures périodiques usuelles, il est possible d'avoir des valeurs supérieures à 1.0 ou inférieures à 0.0, ce qui produit une répétition du motif. Les coordonnées sont généralement attribuées par l'éditeur ou l'outil de modélisation, mais il faut être conscient de cela pour le défilement ou l'application de mouvements à la textures lors de l'exécution.

[modifier] Fonctions périodiques

De nombreux shaders utilisent ces fonctions pour moduler leurs dimensions avec le temps. Lorsqu'il le faut, des informations supplémentaires sont fournies avec le mot clé représentant la fonction pour décrire l'effet d'une période particulière. Il y a actuellement cinq fonctions utilisables dans les shaders de Q3A (NdT : ou de ET) :

  • Sin : Sinusoïdale, une "vague" se déroulant doucement et prenant des valeurs comprises entre -1 et 1.
  • Triangle : La forme correspond à une montée puis une descente abruptes, prenant des valeurs entre 0 et 1.
  • Square : La forme varie simplement de -1 à 1 sans état de transition entre les deux.
  • Sawtooth : Une forme en dents de scie que monte comme la fonction triangle de 0 à 1, mais qui retombe instantanément à 0.
  • Inversesawtooth : C'est le contraire de la forme en dents de scie. La fonction prend instantanément la valeur 1 puis redescend à 0 comme la fonction triangle. La phase correspondant à cette forme va de 1.0 à 0.0 au lieu de 0.0 à 1.0. Cette forme est particulièrement utile pour l'ajout de fondus combinés entre eux.

Ces fonctions ont toutes les propriétés suivantes :

  • <base> C'est la ou la forme commence. L'amplitude est mesurée à partir de cette valeur de référence.
  • <amplitude> C'est la hauteur de la fonction créée, mesurée à partir de la base. Il faudra certainement faire plusieurs tests sur cette valeur pour obtenir quelquechose de correct à chaque nouvelle étape du shader. Plus l'amplitude est grande, plus les pics sont hauts et les creux sont profonds.
  • <phase> C'est une valeur normalisée entre 0.0 et 1.0. Donner une valeur autre que 0 à la phase affecte la valeur initiale de la courbe la ou elle se forme. Une valeur de 0.25 permet de commencer au quart de la courbe. Combiner plusieurs valeurs de phase permet de donner des effets intéressants...
  • <freq> Fréquence. Cette valeur détermine le nombre de cycles de la fonction par seconde. Une valeur de 1 correspond à une "vague" par seconde. Une valeur de 10 correspond à 10 fois par seconde. Une valeur de 0.1 correspond à une fois toutes les 10 secondes.

[modifier] Mots clé généraux

NOTE IMPORTANTE: Encore une fois, il faut conserver à l'esprit que certaines commandes peuvent dépendre de l'ordre dans lequel elles sont placées, c'est pourquoi il est conseillé de placer tous les shaders concernant des commandes globales en tête du script, et ceux qui définissent les différentes étapes du shader à la fin.

Les mots clé suivants sont généraux et affectent toutes les étapes. Ils sont ignorés par Q3MAP.

[modifier] skyParms <farbox> <cloudheight> <nearbox>

Spécifie comment utiliser la surface en tant que ciel, comprenant en option des arguments comme un plan lointain (étoiles, lune,...), une couche de nuages avec définition de ses attributs, et un plan rapproché (montagnes devant les nuages, ...)

<farbox> Précise un ensemble de fichiers à utiliser en tant qu'environnement par delà les nuages. Il faut spécifier "-" pour ne pas prendre en compte cette option, ou un nom de base pour l'utiliser. Un nom de base "env/test" recherchera les fichiers "env/test_rt.tga", "env/test_lf.tga", "env/test_ft.tga", "env/test_bk.tga", "env/test_up.tga", "env/test_dn.tga" pour les utiliser respectivement sur les faces droite / gauche / arriere / avant / de dessus / de dessous.

<cloudheight> Contrôle la courbure de la couche de nuages apparente. Une valeur plus basse signifie une courbure plus importante (donc plus de distorsion à l'horizon). Une valeur plus importante crée un ciel plus "plat" avec moins de distorsion. On peut se représenter la hauteur comme le rayon d'une sphère sur laquelle les nuages son dessinés. Les valeurs qui rendent bien se situent dans l'intervalle \[64,256\]. La valeur par défaut est 128.

<nearbox> Précisé de la même façon que la farbox, destinée à être dessinée par dessus les nuages. Cette fonction n'a pas été testée longtemps, donc il est possible qu'elle ne marche pas. Mettre "-" pour ignorer cette option.

Notes :

  • Si vous faites une map ou le ciel est visible la plupart du temps, utilisez une valeur de cloudheight plus faible. Une courbe plus plate semble plus "vivante". Si vous faites une map ou le ciel est visible principalement à travers des fenêtres ou si la carte est ouverte sur le ciel sur un ou plusieurs cotés, une valeur plus importante donnera une meilleure sensation de réalisme.
  • Il est possible de créer des ciels possédant jusqu'à 8 couches nuageuses, mais cela signifie aussi faire 8 fois les calculs et peut causer des problèmes de performance.
  • Soyez conscient que la skybox n'englobe pas tout le jeu. Le "sol" ou la face de dessous n'est pas dessinée par le jeu. Si un joueur peut voir cette face, il verra un effet de "galerie des miroirs".


Exemple: Script de ciel

textures/skies/xtoxicsky_dm9
{
	qer_editorimage textures/skies/toxicsky.tga
	surfaceparm noimpact
	surfaceparm nolightmap
q3map_globaltexture
q3map_lightsubdivide 256
	q3map_surfacelight 400
	surfaceparm sky
	q3map_sun 1 1 0.5 150 30 60
	skyparms full 512 -
	{
		map textures/skies/inteldimclouds.tga
		tcMod scroll 0.1 0.1
		tcMod scale 3 2
	}
	{
		map textures/skies/intelredclouds.tga
		blendFunc add
		tcMod scroll 0.05 0.05
		tcMod scale 3 3
	}
}

[modifier] cull <side>

Chaque surface d'un polygone à deux cotés, l'avant et l'arrière. Typiquement, on ne voit que la face avant ou l'extérieur. Par exemple, un solide ne peut être vu que de l'extérieur. Dans de nombreux cas, on peut voir les deux faces. Par exemple, pour de l'eau, il est possible de voir les deux cotés. C'est aussi vrai pour les grilles ou les écrans.

Cull signifie ici supprimer. Le paramètre détermine la façon de supprimer. La valeur par défaut est front - si le mot clé n'est pas spécifiée. Cependant, pour des objets qui doivent être inversés, la valeur "back" doit être utilisée. Pour désactiver la suppression d'un côté, il faut utiliser "disable" ou "none". Une seule instruction de ce type pour être donnée pour un shader.

[modifier] cull front

L'avant ou l'extérieur d'un polygone est la seule dessinée dans le jeu. C'est la valeur par défaut. C'est la valeur utilisée si le mot clé "cull" apparaît dans le shader sans de valeur <side> ou si le mot clé n'est pas présent dans le shader.

[modifier] cull back

Ne dessine pas l'arrière - ou l'intérieur - d'un polygone dans le jeu.

[modifier] cull disable, cull none

Aucune des deux faces n'est supprimée. Les deux sont dessinées dans le jeu. C'est très utile pour réaliser des panneaux ou des barrières n'ayant aucune épaisseur comme des grilles, des écrans, des grilles en métal et pour les liquides que le joueur peut voir de l'intérieur. C'est également utilisé pour les champs d'énergie, les sprites, et les effets de certaines armes (plasma).

Note: Pour les objets comme les grilles ou les écrans, il faut mettre la texture avec la propriété cull none sur une face seulement. Sur les autres face, il faut appliquer la texture nodraw

[modifier] deformVertexes

Cette fonction réalise une déformation de la surface en changeant la forme de la surface avant de dessiner les étapes du shader. Vous pouvez cumuler plusieurs commandes deformVertexes afin de modifier les positions de façon complexe, en faisant bouger l'objet selon deux axes différents par exemple.

[modifier] deformVertexes wave
<func> <base><amplitude> <phase> <freq>

Créé pour les surfaces liquides, cela modifie les valeurs différemment en chaque point. Cette propriété accepte les fonctions standards de type sin, triangle, square, sawtooth ou inversesawtooth . Le paramètre "div" est utilisé pour contrôler "l'étalement" de la forme - une valeur égale au tessSizeof de la surface est une bonne valeur (tessSize est une taille de subdivision, en unités, utilisée lors de la représentation dans le jeu).

[modifier] deformVertexes normal
<func> <base><amplitude ~0.1-~0.5> <frequency ~1.0-~4.0>

Cette déformation affecte les faces sans les déplacer, et a des effets sur les étapes suivantes du shader comme l'éclairage et l'environnement. Si le shader n'utilise pas les normales lors des calculs, il n'y aura pas d'effets visibles. (???)

Note: Mettre des valeurs de 0.1 à 0.5 en amplitude et de 1.0 à 4.0 en fréquence donne des résultats satisfaisants. Quelques trucs ont été faits avec ceci tels que : une chauve souris qui bat des ailes, la chute de feuilles, la pluie, des drapeaux...

[modifier] deformVertexes bulge <bulgeWidth> <bulgeHeight><bulgeSpeed>

Cela fait bouger une bosse selon les directions s et t indiquées. Conçu pour être utilisé sur les conduites courbées.


Paramètres spécifiques aux mots clés deform... :

Détermine la taille de la forme. Se mesure en unités. De petites valeurs créent une densité plus importante de formes plus petites coexistant sur une même surface. Des valeurs plus importantes donnent une densité moins importante, ou donnent l'impression de forme plus grandes. Pour un bon aspect, cette valeur devrait correspondre à la valeur (en pixels) déterminée comme tessSize pour la texture. Une valeur de 100.0 est une bonne valeur (ce qui signifie que la tessSize devrait être proche de cette valeur pour donner l'impression de vague).

<func> C'est le type de forme qui est créée : sin, triangle, square, sawtooth ou inversesawtooth.

<base> C'est la distance à la surface d'origine, en unités, dont est déplacé la texture. Une valeur positive fait apparaître la texture au dessus de la surface. Une valeur négative la fait apparaître en dessous.

<amplitude> C'est la hauteur de la fonction créée, mesurée à partir de la base. Il faudra certainement faire plusieurs tests sur cette valeur pour obtenir quelque chose de correct. Plus l'amplitude est grande, plus les pics sont hauts et les creux sont profonds.

<phase> C'est une valeur normalisée entre 0.0 et 1.0. Donner une valeur autre que 0 à la phase affecte la valeur initiale de la courbe la ou elle se forme. Une valeur de 0.25 permet de commencer au quart de la courbe. Combiner plusieurs valeurs de phase permet de donner des effets intéressants...

<freq> Fréquence. Cette valeur détermine le nombre de cycles de la fonction par seconde. Une valeur de 1 correspond à une "vague" par seconde. Une valeur de 10 correspond à 10 fois par seconde. Une valeur de 0.1 correspond à une fois toutes les 10 secondes.

Note: Les paramètres div et amplitude, devraient prendre en compte combien de liquide se déplace lorsqu'il s'agit d'un shader pour de l'eau par exemple. Un océan aura de plus grandes valeurs de div et d'amplitude. En comparaison, il faudra faire en sorte qu'un petit bassin ait moins de mouvements.

[modifier] deformVertexes move<x> <y> <z> <func> <base> <amplitude> <phase> <freq>

Ce mot clé est utilisé pour faire en sorte qu'un brush, model ou une courbe bouge d'un bloc. Les valeurs de <x> <y> et <z> sont les distances et les directions exprimées en unités définissant le mouvement apparent de l'objet.

Les propriétés <func> <base> <amplitude> <phase> et <freq> sont les mêmes que pour les autres fonctions.

Le produit de fonction modifie les valeurs de x, y et z. C'est pourquoi, si il y a par exemple une amplitude de 5 et une valeur de x de 2, l'objet bougera de 10 unités depuis son point d'origine selon l'axe des x. Cela fait au total un mouvement de 20 unités selon cet axe puisque l'amplitude est la variation à la fois au dessus et en dessous du niveau d'origine (base).

Il est à noter qu'un objet qu'un objet utilisant ce shader ne change pas de position, il ne fait qu'en donner l'apparence.

Note: Si un objet est constitué de surfaces avec différents shaders, ils doivent tous avoir des valeurs de fonctions deformVertexes correspondantes, sinon l'objet donnera l'impression de se déchirer.

[modifier] DeformVertexes autosprite

Cette fonction peut être utilisée afin de faire en sorte qu'une paire de triangle (formant un rectangle) se comporte comme une sprite sans devoir créer une nouvelle entité. Cela signifie que la "sprite" sur laquelle est placée la texture va tourner pour apparaître toujours sous un bon angle du point de vue du joueur. Un brush à 4 faces, un patch ou une paire de triangles sur un model .md3 peuvent également avoir cet effet. La face d'un brush contenant une texture dont le shader contient ce mot clé doit être carrée.

Note : C'est sur les objets qui doivent apparaître de la même façon sous tous les angles que l'effet est le meilleur.

[modifier] DeformVertexes autosprite2

C'est une "sprite" légèrement modifiée dans la mesure ou elle ne peut "pivoter" qu'autour de son plus grand axe. Cela permet par exemple de faire un pilier de feu autour duquel on puisse se promener, ou un faisceau d'énergie à travers une pièce.

[modifier] fogparms <red value> <green value> <bluevalue> <distance to Opaque>

Note : Il faut également spécifier "surfaceparm fog" pour que Q3Map identifie les surfaces dans le volume. Ce mot clé décrit comment doit être rendu le brouillard sur les surfaces.

<red value> <green value> <blue value> Valeurs normalisées pour les 3 couleurs.

<distance to opaque> C'est la distance, exprimée en unités et mesurée depuis l'endroit ou se tient le joueur, à laquelle le brouillard est totalement opaque. En faisant un brush d'une distance plus petite que celle la, on peut réduire la densité apparente du brouillard (on atteint jamais la profondeur correspondant à une opacité totale).

  • Le brouillard volumique ne doit avoir qu'une seule face visible à la fois (depuis l'extérieur de ce brouillard).
  • Le brouillard doit être fait avec un unique brush. Il ne peut pas être constitué de plusieurs brushes accolés.
  • Les brushes de brouillard doivent être axiaux. Cela signifie que seuls les brushes cubiques ou parallélépipédiques peuvent contenir du brouillard, et que ceux-ci doivent avoir leurs faces parallèles aux axes de la grille (angles à 90°)

Notes:

  • Si une texture de liquide contient un paramètre relatif au brouillard, elle doit être traité comme une texture de brouillard lors de son utilisation.
  • Si une pièce est complètement remplie de brouillard, on ne doit pouvoir y entrer que par une surface à la fois.
  • Des étapes supplémentaires sur le shader peuvent être placées sur un brush utilisant cette caractéristiques, comme n'importe quel autre brush.

[modifier] nopicmip

La texture ignore la valeur de r_picmip entrée par l'utilisateur. Elle sera toujours en haute résolution. Cela empêche par exemple les textes de devenir illisibles sur les configs arrangées.

[modifier] nomipmaps

Cela implique l'activation de nopicmip, mais empêche aussi la génération de mipmaps basse résolution par la carte 3d. Cela va provoquer de l'aliasing lorsque les textures deviennent plus petites, mais dans certains cas, c'est préférable à une image brouillée. Les petits rubans ou triangles obligent parfois à avoir de très faibles niveaux de mipmaps, ce qui permet de conserver une largeur constante la ou les autres effets prendraient le dessus.

[modifier] polygonOffset

Les surfaces ayant cette caractéristique sont dessinées très légèrement en dehors du plan. Ceci est généralement utilisé pour des marques sur les murs et des "decals". Les distance entre le polygone et le dessin est fixe. Ce n'est pas variable dans Quake III Arena.

[modifier] portal

Précise que cette texture correspond à une surface pour un portal ou un miroir. Dans le jeu, un portal doit être placé directement en face de la texture (à moins de 64 unités). Tout ce que cela fait est de fixer la valeur "sortportal", donc ce n'est pas nécessaire si on l'a déja précisée.

[modifier] sort <value>

Utiliser ce mot clé permet de bien classer l'ordre des shaders en terme "d'épaisseur". Cela permet de ne pas avoir de problèmes avec des shaders étant dessinés dans un mauvais ordre.

Le comportement par défaut est de mélanger tous les shaders de façon additive, sauf les shaders triés qui sont considérés comme opaques. Il n'y a donc a préciser ce mot clé que lorsqu'il y a des problèmes avec plusieurs surfaces transparentes par exemple.

La valeur peut être au choix un chiffre ou un mot clé pris dans la liste ci-dessous (classés par ordre de priorité ascendante):

  • portal (1) : Cette surface est un portal, il est dessiné au dessus de n'importe quel shader vu dans le portal excepté ce qui est dans le champ de vision.
  • Sky (2) : Classiquement, le ciel est ce qu'il y a de plus éloigné. Le dessiner seulement après les surfaces opaques peu être un outil d'optimisation. Cela à actuellement une mauvaise valeur pour cet effet, donc ce n'est pas vraiment utile.
  • Opaque (3) : Cette surface est opaque (peu usité puisque c'est le comportement par défaut avec noblendfunc)
  • Banner (6) : Transparent, sauf très près des murs.
  • Underwater (8) : Dessiné derrière les surfaces transparentes sans attributs particuliers.
  • Additive (9) : Surface normale transparente (valeur par défaut pour les shaders avec des fonctions de mélange : blend-)
  • nearest (16) : Ce shader devrait toujours appraitre comme le plus proche. Utilisé par exemple pour les flashes et les gouttes

[modifier] Mots clé spécifiques à Q3MAP

Ces mots clés changent la nature "physique" des textures et des brushes auxquels ils sont associées. Changer l'un de ces mots clés requiert une nouvelle compilation de la map. Leur effet est global et affecte l'ensemble du shader.

[modifier] tessSize <amount>

Ce mot clé contrôle la taille de tessellation (a quel point la surface est découpée en un grand nombre de triangles) de la surface, et est exprimé en unités. On ne peut affecter cette propriété qu'à des brushes, pas à des courbes, et ce n'est généralement utilisé que pour des surfaces possédant des attributs "deformVertexes". Des abus de ce mot clé peuvent créer d'énormes quantités de triangles.

Note : Cela peut également être utilisé sur des surfaces afin d'être certain que cette taille soit grande, et que par conséquent, q3map crée moins de triangles.

[modifier] q3map_backshader <shadername>

Permet d'utiliser un shader différent, destiné à être vu depuis l'intérieur du brush. Par exemple, cela permet de créer de l'eau dont la surface est vu différemment depuis l'intérieur.

[modifier] q3map_globaltexture

A utiliser parmis les mots clés généraux lorsque la fonction "tcMod scale" est utilisée dans l'une des étapes de création du shader. De nombreux problèmes dans la conception d'effets avec des brushs accolés est le fait de l'optimisation des textures par q3map. Cette option résout ce problème, mais au prix d'une certaine quantité de détails sur les textures même lorsqu'elles sont éloignées de l'origine de la map.

[modifier] q3map_sun <red> <green> <blue> <intensity> <degrees> <elevation>

Ce mot clé, associé au shader d'un ciel va créer l'illusion d'une lumière projetée par une unique source de lumière située à l'infini (lune, soleil...). Ce n'est utilisé que pendant la compilation de la lumière par q3map.

<red><green> <blue> Valeurs normalisées pour les trois couleurs. <intensity> C'est la brillance de la lumière générée. Une valeur de 100 correspond à un soleil. L'intensité de la lumière décroît avec l'angle mais pas avec la distance. <degrees> C'est l'angle correspondant à la direction dans l'éditeur. 0 degrés : est. 90 degrés : nord. 180 degrés : ouest. 270 degrés : sud. <elevation> C'est la distance, mesurée en degrés depuis l'horizon. 0 : lever/coucher de soleil. 90 : zénith.

Note : Les shaders relatifs aux ciels ont toujours une valeur de "q3map_surfacelight". Le soleil donne une puissante lumière directionnelle mais ne fournit pas toujours la lumière voulue pour adoucir et faire ressortir les ombres. Ces shaders devraient donc avoir une plus faible valeur de q3map_sunvalue compensée par une valeur de q3map_surfacelight plus élevée. Une épaisse couche nuageuse diffuse la lumière et lisse les ombres. Le contraire est vrai pour un ciel sans nuages. Dans ce cas, le soleil ou la lune dessinera des ombres plus contrastées.

[modifier] q3map_surfaceLight <light value>

La texture émet de la lumière à l'intensité <light value> choisie. La quantité de lumière émise par la texture dépend de la surface de celle-ci. Afin de donner une impression d'une même luminosité, une petite texture devra être plus lumineuse qu'une grande.

[modifier] q3map_lightimage <texturepath/texturename>

Ce mot clé génère une lumière dont la couleur correspond à la couleur moyenne de la texture spécifiée.

La suite de mots clés pour générer une lumière avec cette propriété devrait être :

  1. q3map_lightimage (la texture produisant la lumière et la couleur de la lumière)
  2. qer_editorimage ; (Image utilisée dans l'éditeur pour choisir l'image)
  3. La couleur de la lumière émise est calculée à partir de la "lightimage".

La raison de l'utilisation de q3map_lightimage dans le shader ci-dessous est que l'on veut que la texture émette une lumière plus jaune parce que le mélange des textures tend sur le jaune.

Exemple : Prendre pour référence une autre image pour émettre la lumière

textures/eerie/ironcrosslt2_10000
{
q3map_lightimagetextures/gothic_light/ironcrosslt2.blend.tga
// this TGA is the source for the color of the blended light qer_editorimagetextures/gothic_light/ironcrosslt2.tga
//base TGA (used because the shader is used with several
// different light values
q3map_surfacelight 10000
//emitted light value of10,000
{
map $lightmap
//source texture is affected by the lightmap
rgbGen identity
// this command handles the overbright bits created by "sunlight"
// in the game
}
{
maptextures/gothic_light/ironcrosslt2.tga
blendFunc filter
rgbGen identity
}
{
maptextures/gothic_light/ironcrosslt2.blend.tga
blendFunc add
}
}

[modifier] q3map_lightsubdivide <value>

Cela permet de définir la largeur des subdivisions (en terme de triangles) sur une surface et est particulièrement destiné à des textures émettant de la lumière comme les ciels. La valeur par défaut est de 120 unités. Cela peut être un facteur déterminant pour la durée de compilation de la lumière.

[modifier] surfaceparm <parm>

Tous les paramètres suivants sont précédés du mot clé surfaceparm :

[modifier] alphashadow

Ce mot clé à pour effet d'indiquer à Q3MAP de prendre en compte le canal alpha de l'image pour projeter les ombres sur le reste de la map.

Note: Cette propriété ne fonctionne pas très bien avec les textures comportant de fins détails comme des lignes (qui risquent de ne pas être prises en compte). Cela fonctionne mieux avec des formes aux contours bien définis et plus larges. La plupart des banderoles déchirées ont cette propriété, ce qui permet d'avoir une ombre avec la forme de la déchirure.

[modifier] areaportal

Un brush contenant ce mot clé se comporte comme un "area portal", et va causer une division lors de la construction de l'arbre de la map sous Q3MAP. Cette propriété est généralement associée à des brushs très fins placés dans des portes (sans être une partie de cette porte). L'avantage est que les triangles présents derrière la porte ne sont pas dessinés lorsque celle-ci est fermée. Le brush doit impérativement toucher tous les brushes structural devant délimiter le portal.

[modifier] clusterportal

Un brush contenant ce mot clé crée une subdivision dans le fichier des zones utilisé pour la circulation des bots. C'est généralement placé dans des endroits correspondant à des séparations naturelles de la map comme les entrées, les portes, les tunnels... C'est sensé permettre aux bots de ne pas à avoir à faire des calculs dans toute la map à la fois. Comme le paramètre areaportal, le brush concerné doit toucher des brushes de type structural à ses extrémités.

[modifier] donotenter

Une propriété spécifique aux bots. Les bots ne pourront pas entrer dans le brush. A utiliser lorsque des bots ont du mal à circuler autour de certaines zones.

[modifier] flesh

Cette surface va avoir des sons différents, et du sang apparaîtra à la place des éclats dus aux impacts des balles

[modifier] fog

Ce brush correspond a du brouillard. Cette fonction permet à q3map de détailler les polygones à l'intérieur du brush de façon adéquate. Il faut également préciser le mot clé fogparms pour décrire de quelle façon le brouillard sera rendu.

[modifier] landmine

Ce mot clé permet d'indiquer que la texture est de la terre, il rajoute un effet lors des impacts de balle et permet de donner plus de réalisme, utile pour les textures d'herbe, de terre ou de sable.

[modifier] lava

La texture à les propriétés de la lave. Cela affecte à la fois la surface et le contenu du brush.

[modifier] metalsteps

Les bruits de pas sont de type "metallique" lorsque l'on marche sur cette surface. Existent aussi : flesh, metalsteps, nosteps, ou default (n'attribue rien de spécial comme son). Il n'est pas encore possible d'attribuer son propre son. Si rien n'est précisé, la valeur est "default".

[modifier] nodamage

Un joueur ne reçoit pas de dommages s'il tombe sur une texture avec ce paramètre.

[modifier] nodlight

Une texture avec ce paramètre ne sera pas affectée par les lumières dynamiques, comme les flashes des armes.

[modifier] nodraw

Une texture avec cette propriété ne sera pas visible dans le jeu. C'est le cas de la plupart des brushs trigger, clip, origin, etc...

[modifier] nodrop

Lorsqu'un joueur meurt dans le volume de ce brush, il ne laisse pas d'arme. C'est utilisé pour les puits profonds. Cela permet d'empêcher l'amassement de polygones dans le fond de tels puits.

[modifier] noimpact

Les entités ne pourront pas frapper ici. Il n'y a pas d'explosion lorsqu'un projectile frappe cette surface, et cela ne laissera pas de marque. Les textures de ciel ont généralement cette propriété.

[modifier] nomarks

Les projectiles explosent au contact de cette surface, mais ne laissent pas de marque. Le sang ne laissera pas de trace non plus. C'est utile pour que les lumières ne soient pas temporairement obscurcies durant la bataille.

Note: A utiliser sur chaque surface avec le mot clé "deformVertexes". Sinon, des marques vont apparaître en l'air.

[modifier] nolightmap

Cette texture n'a pas de lien avec la lightmap. Elle n'est pas affectée par la lumière qui l'entoure. Ne requiert pas le mot clé "rgbGen identity" à cette étape.

[modifier] nosteps

Un joueur ne fait pas de bruit lorsqu'il marche sur cette texture.

[modifier] nonsolid

Une fois dans le jeu, le brush ne bloque pas le mouvement des entités. Il est contenu dans les shaders des textures triggers, hint et autres dans le même genre. Cela affecte le contenu du brush.

[modifier] origin

Utilisé par la texture "origin". Les entités tournantes (func_rotating) doivent en contenir un. Le brush doit être rectangulaire. Le point d'origine correspond au centre du brush.

[modifier] playerclip

Bloque les mouvements du joueur. Les autres entités du jeu peuvent passer à travers une telle surface. Cela sert à bloquer les joueurs sans bloquer les projectiles.

[modifier] slick

Rend la texture glissante (moins de frottements).

[modifier] slime

La texture aura les propriétés de la boue. Cela affecte à la fois la surface et le contenu du brush.

[modifier] structural

Cet attribut fait comprendre à Q3MAP que cette surface est un point de découpe possible pour la phase de compilation BSP. C'est une partie du shader de la texture "hint". Par défaut, chaque texture n'étant pas précisée comme "détail" a cette propriété, donc ce n'est pas la peine de le spécifier dans ce cas.

[modifier] trans

Fait comprendre à q3map que cette surface ne doit pas bloquer la vue (vis). Habituellement, chaque shader avec des propriétés de type blendfuncs devrait contenir ce mot clé.

[modifier] water

Assigne à la texture les propriétés de l'eau une fois dans le jeu.


[modifier] Instructions spécifiques à l'éditeur

Ces instructions n'affectent l'aspect de la texture que dans Radiant. Elles devraient être groupées avec les paramètres de la surface, et en tête de ceux-ci.

[modifier] qer_editorimage <texture path/texturename>

Le shader créé dans le jeu est indépendant de ce mot clé, mais dans l'éditeur, c'est l'image spécifiée par cette commande qui est visible (dans l'exemple ci-dessous, il s'agit de textures/eerie/lavahell.tga).

L'éditeur dessine la texture en utilisant les attributs du fichier TGA précisé avec cette commande. Lorsqu'une image représente un shader, n'importe quelle texture utilisée dans les étapes suivantes est redimensionnée afin que ces dimensions correspondent à celles de cette image. Par exemple, si une image de 128x128 pixels est utilisée pour représenter un shader, une image de 256x256 pixels utilisée plus tard dans ce même shader sera réduite pour que sa taille corresponde. Il faut penser à vérifier ce point sur les shaders dont les images dans le jeu ne correspondent pas à celles dans l'éditeur. Pour rappel, on peut utiliser "tcMod scale 0.5 0.5" pour doubler la taille d'une image, et "tcMod scale 2 2" pour la diviser par 2.

Note : Les shaders base_light et gothic_light en particulier contiennent cette propriété. Cela peut être très utile pour faire des lumières avec différents styles (des changements de luminosité en particulier) sans avoir à créer un nouveau TGA pour chaque shader.

textures/liquids/lavahell2 //chemin et nom de la nouvelle texture
{
    qer_editorimagetextures/eerie/lavahell.tga //basé sur ceci
    qer_nocarve                                //ne peut pas être coupé par CSG subtract
    surfaceparm noimpact                       //les projectiles ne peuvent pas toucher la surface
    surfaceparm lava                           //la surface à les propriétés de la lave
    surfaceparm nolightmap                     //la lumière environnante n'affecte pas la texture
    q3map_surfacelight 3000                    //la texture émet de la lumière
    tessSize 256                               //les triangles sont relativement grands
    cull disable                               //on ne supprime aucune surface
    deformVertexes wave 100sin 5 5 .5 0.02
    fogparms 0.85191420.309723 0.0 128 128
    {
        maptextures/eerie/lavahell.tga         //texture de base
        tcMod turb .25 0.2 1 0.02              //la texture subit des turbulences
        tcMod scroll 0.1 0.1                   //la turbulence se déplace
    }
}

[modifier] qer_nocarve

Un brush ayant cette propriété n'est pas affecté par la fonction CSG substract. C'est particulièrement utile pour les brushes d'eau ou de brouillard.

[modifier] qer_trans <value>

Ce paramètre détermine le pourcentage de transparence qu'un brush aura lorsqu'on le verra dans l'éditeur (cela n'a pas d'effet dans le jeu). La valeur est comprise entre 0 et 1. Plus celle-ci est grande, plus la texture est opaque.
Views
Outils personnels
Navigation
Wiki-mapping
Boîte à outils