Shader 1 Mots clés généraux
Un article de Wiki-Mapping.
Version du 12 septembre 2006 à 12:20 (modifier) Psylopat (Discuter | contribs) M (→Fonctions périodiques) ← Différence précédente |
Version actuelle (25 octobre 2007 à 22:57) (modifier) (défaire) Psylopat (Discuter | contribs) M |
||
(7 révisions intermédiaires masquées) | |||
Ligne 1: | Ligne 1: | ||
- | '''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). | ||
- | |||
- | == 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. | ||
- | |||
- | === 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. | ||
- | |||
- | === 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. | ||
- | |||
- | === 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 | ||
- | |||
- | === 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. | ||
- | |||
- | === 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. | ||
- | |||
- | === 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. | ||
- | |||
- | === 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. | ||
- | |||
- | === 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 | ||
- | |||
- | ;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. | ||
- | |||
- | == 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. | '''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. | ||
Ligne 110: | Ligne 51: | ||
''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. | ''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. | ||
- | + | ; cull front | |
- | L'avant ou l'extérieur d'un polygone est la seule face 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. | + | :L'avant ou l'extérieur d'un polygone est la seule face 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. |
- | + | ; cull back | |
- | Ne dessine pas l'arrière - ou l'intérieur - d'un polygone dans le jeu. | + | :Ne dessine pas l'arrière - ou l'intérieur - d'un polygone dans le jeu. |
- | + | ; 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). | + | :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 | '''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 | ||
Ligne 128: | Ligne 69: | ||
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. | 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. | ||
- | + | Les mots clés deform... peuvent avoir les paramètres suivants : | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
;<nowiki><div></nowiki> : 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). | ;<nowiki><div></nowiki> : 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). | ||
Ligne 158: | Ligne 85: | ||
'''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. | '''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. | ||
- | === deformVertexes move<x> <y> <z> <func> <base> <amplitude> <phase> <freq> | + | === wave === |
+ | |||
+ | <pre>deformVertexes wave <div> <func> <base><amplitude> <phase> <freq></pre> | ||
+ | |||
+ | 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). | ||
+ | |||
+ | === normal === | ||
+ | |||
+ | <pre>deformVertexes normal <div> <func> <base><amplitude 0.5> <frequency 4.0></pre> | ||
+ | |||
+ | Cette déformation affecte les normales 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... | ||
+ | |||
+ | === bulge === | ||
+ | |||
+ | <pre>deformVertexes bulge <bulgeWidth> <bulgeHeight><bulgeSpeed></pre> | ||
+ | |||
+ | Cela fait bouger une bosse selon les directions s et t indiquées. Conçu pour être utilisé sur les conduites courbées. | ||
+ | |||
+ | === move === | ||
+ | |||
+ | <pre>deformVertexes move<x> <y> <z> <func> <base> <amplitude> <phase> <freq></pre> | ||
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. | 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. | ||
Ligne 170: | Ligne 119: | ||
'''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. | '''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. | ||
- | === | + | === autosprite === |
+ | |||
+ | <pre>DeformVertexes autosprite</pre> | ||
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. | 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. | ||
Ligne 176: | Ligne 127: | ||
'''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. | '''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. | ||
- | === | + | === autosprite2 === |
+ | |||
+ | <pre>DeformVertexes autosprite2</pre> | ||
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. | 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. | ||
Ligne 222: | Ligne 175: | ||
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): | 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 | |
+ | |||
+ | [[Catégorie:Shader]] |
Version actuelle
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.
Sommaire |
[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.
- cull front
- L'avant ou l'extérieur d'un polygone est la seule face 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.
- cull back
- Ne dessine pas l'arrière - ou l'intérieur - d'un polygone dans le jeu.
- 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.
Les mots clés deform... peuvent avoir les paramètres suivants :
- <div>
- 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] wave
deformVertexes wave <div> <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] normal
deformVertexes normal <div> <func> <base><amplitude 0.5> <frequency 4.0>
Cette déformation affecte les normales 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] bulge
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.
[modifier] move
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] autosprite
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] autosprite2
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