Shader 0 Généralités sur les shaders

Un article de Wiki-Mapping.

Jump to: navigation, search

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<ref>Level Designer Reference</ref>, 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.

Sommaire

[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 à 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 su 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.

<references/>