Matériaux et effets spéciaux

Les matériaux des modèles peuvent être très divers dans Ultimate 3D. Chaque matériel peut utiliser sa propre combinaison de textures, ainsi que des effets de shader. Le système d'effet de shader tout entier d'Ultimate 3D est directement lié au système de matériaux. Utiliser des effets de shader signifie définir des propriétés pour les matériaux. Mais les effets de shaders customisés ne sont pas le sujet de ce tutorial. Ici, vous allez apprendre les bases dont vous aurez besoin pour définir des shaders et d'autres effets plutôt cools qui fonctionnent sans shaders. Vous allez également apprendre deux superbes techniques d'effets spéciaux : l'environment mapping, le fameux éclairage par pixel (per pixel lighting) ainsi que le parallax mapping.

Chargement et création de textures spéciales

Il n'y a pas que les textures 2D dont nous avons parlé dans le tout premier chapitre. Il existe aussi deux autres types de textures. Le premier type est une height map. Les Height maps sont des images en niveaux de gris qui contiennent les informations sur la hauteur. Un pixel blanc est un pixel vraiment très haut, alors qu'un pixel noir sera très bas. Il est important que vous compreniez ce qu'est une height map, parce que vous en aurez besoin pour beaucoup d'effets. C'est pourquoi je vais utiliser un exemple pour l'expliquer.

Jetez un coup d'oeil à la prochaine texture. Elle représente un simple mur de briques. L'image de gauche défini les couleurs des pixels influencés par la lumière diffuse, on parle de diffuse map. Et sur la droite vous avez la height map.

Notez que les intervales entre les pierres sont noirs sur la height map, parce qu'elles sont plus faibles que le reste. Les pierres sont blanches parce qu'elles sont plus hautes. Mais certaines pierres ne sont pas parfaitement construites et c'est pour cette raison qu'elles sont plus foncées dans la height map. Elles sont plus basses que les autres.

Donc à quoi sont utiles les heights maps? Elles sont extrêmement utiles parce qu'elles peuvent être utilisées pour donner des informations à propos de la surface des objets. De cette façon vous pouvez simuler le relief qui rendent les graphismes de votre beaucoup plus détaillés et réalistes. C'est ce que l'éclairage par pixel (per pixel lighting) et le parallax mapping font. Malheureusement la height map seule est inutile pour ces effets. Ceux-ci nécessitent également une autre texture appellée : normal map. Mais c'est quelque chose dont vous n'avez pas besoin de vous soucier. Ultimate 3D la génére pour vous. Vous avez juste à utiliser une autre fonction pour charger des heights maps:

Cette fonction charge une height map depuis un fichier spécifié et calcule une normal map pour cette dernière. Une copie de la height map est sauvegardée dans le canal dédié à l'alpha de la texture qui en résulte.

LoadHeightMap(
TextureIndex,
HeightMapFile,
HeightFactor
)

TextureIndex
L'indice de la texture qui lui sera associé. Vous devriez être familiarisé avec ce paramètre depuis la description de la fonction LoadTexture(...).

HeightMapFile
Le nom du fichier qui contient la height map (en incluant le chemin du fichier et l'extension).

HeightFactor
C'est le seul paramètre nouveau. Quand Ultimate 3D calcule une normal map, ce dernier a besoin de savoir de combien est la hauteur de la texture par rapport à la largeur et la hauteur de cette dernière. On pourrait dire que cela définit la hauteur de la couleur blanche sur la height map. Une valeur adaptée pour ce paramètre est 16.

Il y a un autre type de texture que vous ne connaissez pas encore. Celui-ci est un peu étrange. Au début vous ne saurez pas quoi en faire, mais cela changera assez vite. Ces textures sont appellées cube maps. Elles ne sont pas seulement faites d'une image 2D, mais de six images carrées. En principe cela fonctionne de la même façon que les sky cubes (les images d'arrière-plans (backgrounds)). Vous avez six images qui sont assemblées pour former un cube. Dans ce cas vous ne devez surtout pas utiliser des coordonées 2D, mais 3D. Vous verrez comment faire cela plus tard et vous apprendrez à quoi elles servent. Charger des cube maps est similaire à charger des sky cubes. Il n'y a qu'une fonction pour le faire et elle ne prend qu'une chaîne de caractères pour identifier les six fichiers:

Cette fonction crée une texture de cube à l'aide des six fichiers spécifiés et y associe l'indice donné.

LoadCubeTexture(
FileScheme,
TextureIndex,
CubeWidth
)

FileScheme
La construction du nom de fichier. Cette chaîne doit contenir une "*". Elle sera remplacée par les mots "Left", "Right", "Top", "Bottom", "Front" et "Back". Ainsi si vous écrivez "gfx/CubeMap*.png" Ultimate 3D cherchera les fichiers : "CubeMapLeft.png", "CubeMapRight.png", "CubeMapTop.png" et ainsi de suite.

TextureIndex
L'indice de la texture qui lui sera associé. Vous devriez être familiarisé avec ce paramètre depuis la description de la fonction LoadTexture(...).

CubeWidth
L'échelle à laquelle sera agrandie chaque texture (Si elles n'ont pas déjà cette taille). Ce paramètre doit être une puissance de deux.

Les textures prennent beaucoup de mémoire, donc il n'est pas bon d'avoir un trop grand nombre de textures chargées en même temps. Pour vous donner la possibilité de vous débarrasser des textures chargées, il existe la fonction ReleaseTexture(...). Cette fonction supprime la texture spécifiée de la mémoire et redéfini l'indice associé à la texture à son état d'origine. Voici sa description:

ReleaseTexture(
TextureIndex
)

TextureIndex
L'indice de la texture que vous voulez libérer de la mémoire.

Remarquez que les cubes maps ne sont pas supportées par certaines cartes graphiques très anciennes. Pour cette raison il existe la fonction GetCubeMapSupport() qui retourne true si les cubes maps sont supportées et false si elles ne le sont pas.

Indices des matériaux

Beaucoup de fonctions décrites ci-dessous prennent un argument appelé  MaterialIndex. Je vais vous expliquer ce que cela signifie ici une fois, pour éviter les répetitions sans fin. Comme vous devez le savoir par votre expérience en modélisation, un modèle peut utiliser différents matériaux pour les différentes surfaces du modèle. La plupart des programmes de modélisation offre la possibilité de donner un nom à chaque matériau. C'est vraiment utile parce que si vous utilisez un programme de modélisation qui n'offre pas cette possibilité, vous devez devinier l'indice du matériau en question. Je vous conseille de donner des noms qui ont du sens à vos matériaux. Ne les appellez pas seulement material01, material02 etc. Cela rendra votre code plus aisé à lire.

Les fichiers *.an8 et *.3ds contiennent des informations à propos des noms des matériaux. Les fichiers *.md2 ne peuvent avoir qu'un seul matériel qui est toujours nommé "material_md2". Les fichiers *.x ne contiennent pas les noms des matériaux. Ces matériaux sont appellés "material00" à "materialXX". Ce qui est cool avec les noms de matériaux c'est que vous n'avez pas besoin de vous occuper de la signification des indices des matériaux si vous connaissez leurs noms, parce que vous pouvez simplement utiliser une fonction pour en obtenir l'indice.

Cette fonction retourne l'indice du matériau avec le nom spécifié, ou l'indice du premier matériau (0) si aucun matériau avec ce nom existe. Ce paramètre est insensible à la casse.

GetMaterialIndex(
MaterialName
)

MaterialName
Le nom du matériau dont vous voulez récupérer l'indice.

Parfois il arrive aussi que vous souhaitez faire quelque chose pour chacun des matériaux d'un modèle. Dans ce cas vous pouvez simplement utiliser une boucle for. Pour obtenir le nombre de matériaux présents dans le modéle, vous pouvez utiliser GetMaterialCount().

Changer la couleur d'un matériau

Comme pour les objets primitifs, vous pouvez changer la couleur des matériaux des modèles quand vous le voulez. À nouveau, il y a deux fonctions destinées à cette fin. Une pour définir la partie diffuse du matériau et l'autre pour définir la partie émissive de ce matériau. Les voici.

Cette fonction change la couleur diffuse du matériau donné, de l'objet qui l'appelle.

SetModelMaterial(
MaterialIndex,
R, G, B, A
)

MaterialIndex
L'indice du matériau dont vous souhaitez changer la couleur diffuse.

R, G, B, A
La nouvelle couleur diffuse du matériau. Les valeurs de ces paramètres doivent se situer dans une fourchette allant de 0 à 255.

Cette fonction change la couleur emissive du matériau de l'objet par lequel il est appellé.

SetModelMaterialEmissive(
MaterialIndex,
R, G, B
)

MaterialIndex
L'indice du matériau pour lequel vous voulez changer la couleur émissive.

R, G, B
La nouvelle couleur émissive du matériau. Les valeurs pour ce paramètre doivent se situer entre 0 et 255.

En addition, vous pouvez définir une couleur spéculaire (specular color) et une puissance spéculaire (specular power) pour les matériaux du modèle. Les éclairages spéculaires donnent à l'objet un aspect rutilant, en les éclaircissant très fort à la position où ils reflètent la source de lumière. Elles sont utiles pour les surfaces humides ou pour les matières plastiques. Avant de pouvoir parler de la fonction qui défini la couleur spéculaire d'un matériau d'un modèle, il vous faut connaître trois variables additionelles pour les objets de lumières, qui n'ont pas été mentionnées dans le chapitre sur les sources de lumière, étant donné qu'elles appartiennent à la partie avancée de cette documentation. Voici leur description.

spec_r, spec_g, spec_b
Ces variables définissent la couleur spéculaire pour une source de lumière. Elles doivent toutes se situer dans une fourchette allant de 0 à 255, mais elles peuvent aussi être supérieures ou inférieures. Elles peuvent être changées à tout moment (si Step() est à sa place). Cette couleur est multipliée par la couleur spéculaire, définie pour le matériau du modèle, afin de déterminer la véritable couleur spéculaire. Ces variables vous permettent de contrôler quelles sources de lumière influent sur l'éclaircissement spéculaire et lesquelles n'influent pas, de quelle force sont les éclaircissements spéculaires et de quelles couleurs sont ces éclaircissements.

Une fois que vous avez défini des valeurs positives pour ces variables dans quelques sources de lumières, il est logique d'appeller la fonction suivante pour certains modèles. Il n'est pas nécessaire d'utiliser cette fonction cependant, Ultimate 3D peut charger la couleur spéculaire et la puissance spéculaire depuis les fichiers *.u3d, *.an8, *.3ds et *.ms3d, ainsi vous pouvez simplement définir ces valeurs dans votre programme de modélisation.

Cette fonction définit une nouvelle couleur et puissance spéculaire pour le matériel donné du modèle de l'objet, par lequel la fonction est appellé.

SetModelMaterialSpecular(
MaterialIndex,
R, G, B,
Power
)

MaterialIndex
L'indice du matériau dont vous voulez changer la couleur spéculaire et la puissance spéculaire.

R, G, B
La couleur spéculaire qui sera définie. Les valeurs doivent être dans une fourchette allant de 0 à  255.

Power
La puissance spéculaire. Il s'agit d'une puisssance mathématique. Juste après son calcul, le facteur d'éclaircissement spéculaire est aussi mat que la lumière diffuse. Ensuite il est élevé à la puissance donnée. De cette façon l'éclaircissement spéculaire est plus fort. Plus forte est la puissance, plus fort est l'éclaircissement spéculaire. Une bonne valeur pour un éclaircissement spéculaire fort est 32.

Que l'éclaircissement spéculaire rende bien est une question de goût. À mon avis cela ne donne pas un bel effet. Cela donne un aspect artificiel et irréel aux choses. Les seuls matériaux pour lesquels cela doit être utilisé sont les matières plastiques ou humides. Sur quoi que ce soit d'autre, cela rend vraiment mal. Pour les matières réfléchissantes vous devriez plutôt utiliser l'environment mapping. Donc lisez ce qui vient.

Environment mapping

Nom mystèrieux, technique géniale. En principe, le nom la décrit très bien. L'environment mapping est une technique où vous prenez des photos de l'environnement et vous les appliquez interactivement sur un objet. Lorsque vous utilisez l'environment mapping vous n'avez plus de coordonnées statiques de texture. À la place, le périphérique graphique les calcule à chaque frame, selon la position du vertex (sommet), l'orientation du triangle et la position de la caméra.

Il y a deux types d'environment mapping différent. Le premier s'appelle spherical environment mapping, ou en plus court, sphere mapping. Pour cette technique, vous avez besoin d'une sphere map. C'est une texture qui contient une image de l'environnement telle qu'il serait refletée par une sphère en chrome. Sur le site d'Ultimate 3D, ainsi que sur Le CBNA, vous trouverez un programme pour créer ces spheres maps.
L'autre technique est appellée cubical environment mapping, ou en plus court, cube mapping. Pour cette technique, vous avez besoin des cubes maps dont je vous ai parlé dans un des précédents sous-chapitres.

Activer l'environment mapping est très simple. Il vous suffit d'appeller une fonction dans laquelle vous dîtes à Ultimate 3D quel matériau utiliser pour l'environment mapping et quelle texture contient l'environment map:

Cette fonction établit l'environment mapping pour le matériau donné de l'objet qui appelle cette fonction.

SetMaterialEnvironmentMap(
MaterialIndex,
TextureIndex
)

MaterialIndex
L'indice du matériau sur lequel vous voulez appliquer l'environment mapping.

TextureIndex
L'indice de la texture qui contient l'environment map. Si c'est l'indice d'une texture normale, le spherical environment mapping sera activé, sinon ce sera le cubical environment mapping qui le sera. Si vous voulez désactiver l'environment mapping pour ce matériau passez -1.

Lors de l'utilisation de l'environment mapping vous devriez soit, utiliser une image très sombre en tant qu'environment map ou alors vous devrez définir une couleur très sombre pour le matériau du modèle, parce que l'environment map est appliqué par l'addition de la couleur du texel (pixel d'une texture) à la précédente couleur du pixel dans l'environment map. Si vous n'aimez pas ça, vous pouvez le changer en utilisant la fonction SetMaterialStageTextureOperation(...) (voir ci-dessous).

Bump mapping et parallax mapping

Maintenant cela devient réellement intéressant. Cette technique est incroyablement populaire parce qu'elle rend vraiment bien. En réalité, je n'aime pas le terme "bump mapping" parce qu'il représente de très très nombreuses techniques différentes. Ce dont je vais parler ici est aussi connu sous le nom d'éclairage par pixel (per pixel lighting), de normal mapping, ou dot3 bump mapping. C'est une technique pour éclairer les matériaux, en simulant la hauteur de chaque pixel en utilisant les height maps. Le parallax mapping est une technique où une height map est utilisée pour déformer une texture selon la position de la caméra. Et donne l'impression que c'est réellement en trois dimensions en procurant une sensation de profondeur. Pour vous donner une idée de ce que cela signifie, voici un petit screenshot:

Ce screenshot représente un modèle éclairé par trois sources de lumière (représentées par les petites sphères). Le modèle ne fait pas plus de 12 triangles. L'effet de profondeur et d'éclairage détaillé est dû aux effets spéciaux. Cela peut mieux se voir au bas de la pièce. La lumière verte n'éclaire que le côté droit des briques sur la gauche et seulement le côté gauche des briques sur la droite. De fait, il vous est impossible de voir l'arrière des briques, à cause du parallax mapping. En revanche, l'avant des briques semblent plus gros.

Le parallax mapping et le bump mapping sont des effets de shader extrêmement complexes. Ils requièrent beaucoup de mathématique et de programmation de bas niveau pour les réaliser (surtout lorsqu'on utilise Direct 3D 8.1). Heureusement vous utilisez Ultimate 3D ;). Vous n'avez pas plus à faire qu'à appeller une fonction. Le reste du travail, c'est UItimate 3D qui le fait.

Cette fonction active l'effet de bump mapping et/ou de parallax mapping pour le matériel donné de l'objet par lequel elle est appelée.

ApplyParallaxAndBumpMapping(
MaterialIndex,
HeightMapIndex,
ParallaxFactor,
LightSourceID1,LightSourceID2,LightSourceID3
)

MaterialIndex
L'indice du matériel qui sera appliqué.

HeightMapIndex
L'indice de la height map que vous avez chargé précedemment à l'aide de LoadHeightMap(...).
(Alternativement vous pouvez utiliser LoadTexture(...) pour charger une normal map précalculée avec la height map dans l'alpha de la normal map). Vous pouvez passer -1 pour ce paramètre si vous ne voulez pas simuler de surface à la texture, mais cela serait un gaspillage de temps de calcul et le parallax mapping ne rendrait pas de façon réaliste.

ParallaxFactor
Ce paramètre indique à Ultimate 3D de combien l'effet de parallaxe doit être. Cela dépend de la façon dont la texture est mappée sur le modèle. Usuellement la valeur est très petite (pour le screenshot ci-dessus j'ai utilisé 0.02). Si vous entrez une valeur trop grande pour ce paramètre, il semble évident que la texture ne sera qu'étirée et tout aura l'air étrange. Soyez donc prudent avec cela. Si vous passez 0 ici le parallax mapping ne sera pas utilisé, ce qui prendra moins de temps de calcul.

LightSourceID1, ..., LightSourceID3
Le nombre de source de lumière qui peut être utilisé pour l'éclairage par pixel est limité du fait des limitations du modèle de shader 1.4. Il est impossible d'implémenter plus de sources de lumière avec ce modèle de shader. En implémenter trois était déjà suffisamment difficile. Pour cette raison vous devez entrer les ids d'instance des objets servants de source de lumière pour l'effet. LightSourceID1 peut être une lumière directionnelle ou un point de lumière (light point). Les deux autres sources ne peuvent être que des points de lumière (light point). Moins vous utiliserez de sources de lumière, moins le temps de calcul sera important. Si vous ne passez aucune source de lumière le bump mapping sera désactivé.

Comme je l'ai déjà dit, ces deux effets sont véritablement complexes. Ultimate 3D vous cache beaucoup du fonctionnement de ces derniers, pour les rendre plus simple d'usage. Lorsque vous lirez le chapitre sur les programmation des shaders vous acquiererez une meilleure compréhension de ce que ces effets font vraiment. Pour cette raison, il vous faut apprendre un certain nombre de choses à ne pas faire lors de l'utilisation de cet effet.
Avant tout vous devez savoir que l'éclairage spéculaire par pixel (per pixel specular lighting) n'est pas supporté comme une fonctionnalité intégrée. C'est pourquoi tous les éclairages spéculaires disparaîtront si vous activez le bump mapping avec ApplyParallaxAndBumpMapping(...).
Vous ne pouvez pas utiliser l'environment mapping ou d'autres effets de multi texturage simultanément avec l'effet de parallaxe et de bump mapping, ni d'autres effets de shader pour ce matériau.
De surcroît, vous ne pouvez appliquer d'effet de parallaxe, ni de bump mapping aux objets utilisants le vertex tweening (ce qui est toujours le cas pour les fichiers *.md2). Aussi, les modèles utilisant le vertex skinning ne doivent pas avoir plus de 28 os s'ils utilisent le bump map ou le parallax mapping. Tous les os avec un indice supérieur ne seront pas transformés correctement.

Pour finir, vous devez savoir que toutes les cartes graphiques ne supportent pas le parallax mapping et le bump mapping. Ces effets sont des effets de shader requérant le modèle de shader 1.4. C'est pourquoi vous devrez appeller GetSupportedPSVersion() avant tout. Cette fonction retourne la version la plus haute des shaders supportée en tant que nombre décimal. Cela peut être 1.0, 1.1, 1.2, 1.3 ou 1.4. Ainsi pour vérifier que le parallax mapping ou le bump mapping est supporté, il vous faudra écrire:

if(GetSupportedPSVersion()>=1.4){
// Le parallax mapping et le bump mapping sont supportés
}
else{
// Le parallax mapping et le bump mapping ne sont pas supportés
}

Fonctions de multi-texturing

Un matériau n'est pas contraint de n'utiliser qu'une texture. Vous avez déjà vu deux exemples de multi texturing. Lorsque vous utilisez l'environment mapping, un matériau peut utiliser une texture diffuse, et une environment map en même temps. Lorsque vous utilisez le parallax mapping ou le bump mapping, un matériau utilise une texture diffuse et une height map en même temps. Selon la carte graphique, un PC peut utiliser jusqu'à huit textures simultanément. La fonction GetSimultaneousTextureCount()retourne combien de textures peuvent être utilisées simultanément sur le PC l'exécutant. Dans le pire de cas (ndt: vraiment le pire ^^) c'est seulement une.

Utiliser plusieurs textures, c'est à dire la technique de multi texturing, peut être utilisée pour faire de superbes effets et la programmation des shaders n'est pas imaginable sans le multi texturing. Une importante implémentation du multi texturing est le light mapping, une technique où vous créez une texture décrivant l'éclairage d'un objet en utilisant un programme tel que Deled et où vous l'appliquez à l'objet. De cette façon, vous obtiendrez un éclairage très détaillé, mais statique, ne requèrant aucun temps de calcul.

Mais comment cela fonctionne? En principe c'est très simple. Selon la carte graphique, vous pouvez aller jusqu'à huits niveaux de texture. Chaque niveau de texture utilise une texture, un ensemble de coordonnées de texture du mesh et une opération sur la texture. La chose la plus compliquée ici est l'opération sur la texure. Cela défini, de quelle façon sera appliquée la texture utilisée à ce niveau au résultat des niveaux précédents. Par exemple la couleur du pixel peut être additionnée (c'est ainsi que c'est réalisé lors de l'utilisation de l'environment mapping) ou multipliée. Ce sont les deux opérations de texture les plus communes. Pour définir ces trois propriétés de niveau de texture, il existe trois fonctions:

Cette fonction définit la texture de l'objet l'appellant, qui sera utilisée pour le niveau de texture donné du matériau indiqué.

SetMaterialStageTexture(
MaterialIndex,
TextureStage,
TextureIndex
)

MaterialIndex
L'indice du matériau que vous désirez modifier.

TextureStage
Le niveau de texture que vous souhaitez modifier. Ce paramètre peut prendre des valeurs comprises entre 0 et 7, inclus.

TextureIndex
L'indice de la nouvelle texture à utiliser pour le niveau de texture.

Cette fonction change, pour l'objet qui l'appelle, l'ensemble des coordonnées de la texture, à utiliser au niveau de texture donné pour le matériau spécifié.

SetMaterialStageTexCoord(
MaterialIndex,
TextureStage,
TextureCoordinateSetIndex
)

MaterialIndex
L'indice du matériau que vous souhaitez modifier.

TextureStage 
Le niveau de texture que vous souhaitez modifier. Ce paramètre peut prendre des valeurs comprises entre 0 et 7, inclus.

TextureCoordinateSetIndex
Dans le chapitre sur la manipulation des meshs, vous avez appris qu'un mesh peut possèder jusqu'à huit ensembles de coordonnées de texture. Ce paramètre donne l'indice de l'ensemble de coordonnées de texture à utiliser pour le niveau de texture précedemment spécifié. Par défaut ce paramètre est 0 (le premier ensemble de coordonnées de texture). Selon le nombre d'ensemble de coordonnées de texture que vous avez créé pour le mesh en question, ce paramètre peut être compris entre 0 et 7, inclus. Aussi, vous pouvez entrer -1 pour obtenir l'ensemble de coordonnées de texture de l'environment mapping, -2 pour obtenir l'ensemble de coordonnées de texture de l'environment mapping calculé avec une autre technique, ou -3 pour obtenir les coordonnées du vertex sur l'écran en tant que coordonnées de texture.

Cette fonction change l'opération à effectuer sur la texture, de l'objet qui l'appelle, pour le niveau de texture donné du matériau précisé.

SetMaterialStageTextureOperation(
MaterialIndex,
TextureStage,
TextureOperation
)

MaterialIndex
L'indice du matériau à modifier.

TextureStage
Le niveau de texture que vous souhaitez modifier. Ce paramètre peut prendre des valeurs comprises entre 0 et 7, inclus.

La texture de scène qui doit être modifié. Ce paramètre peut prendre les valeurs comprises dans une fourchette de 0 à 7.

TextureOperation
Comme énoncé plus haut, l'opération de la texture défini comment la texture est appliquée au résultat des niveaux de texture précédents. Le premier niveau de texture multiplie toujours la couleur diffuse, calculée en utilisant les données du matériau et les sources de lumière, avec la couleur de la texture et en multipliant le résultat par deux. Le deuxième niveau de texture prend les couleur du niveau de texture précédent, et les combine avec la couleur de la nouvelle texture en utilisant l'opération de texture que vous avez défini. Cela va de même pour les autres niveaux de texture. Chaque valeur entière que vous entrez pour ce paramètre correspond à une opération de texture. Voici la liste des valeurs possibles et à quelles opérations elles correspondent:
1: Cette opération de texture multiplie la couleur actuelle avec la couleur de la texture: CouleurTexture*CouleurActuelle.
2: Cette opération de texture multiplie la couleur actuelle avec la couleur de la texture et multiplie le résultat par deux: CouleurTexture*CouleurActuelle*2.
3: Cette opération de texture multiplie la couleur actuelle avec la couleur de la texture et multiplie le résultat par quatre: CouleurTexture*CouleurActuelle*4.

4: Cette opération de texture additionne les couleurs actuelles à la couleur de la texture: CouleurTexture+CouleurActuelle.
5: Cette opération de texture prend la couleur actuelle et soustrait 128 des données r,v,b de celle-ci. Ensuite elle ajoute la couleur de la texture: CouleurTexture+CouleurActuelle-128.
6: Cette opération de texture prend la couleur actuelle et soustrait 128 des données r,v,b de celle-ci. Ensuite elle ajoute la couleur de la texture et mutiplie le tout par deux: (CouleurTexture+CouleurActuelle-128)*2.
7: Cette opération de texture prend la couleur actuelle et la soustrait à la couleur de la texture: CouleurTexture-CouleurActuelle.
8: Cette opération de texture prend la couleur actuelle et calcule un produit scalaire avec les données de la couleur élevées ou réduites dans une fourchette de -1 à 1: RVB = ( (CouleurTexture.R-128)/128)*(CouleurActuelle.R-128)/128 + (CouleurTexture.V-128)/128*(CouleurActuelle.V-128)/128 + (CouleurTexture.B-128)/128*(CouleurActuelle.B-128)/128 )*255. 

Lors de l'utilisation du multi texturing la donnée alpha utilisera toujours une opération de texture multiplicatrice (CouleurFinale.a = CouleurTexture.a*CouleurActuelle.a). Cela signifie donc que vous pouvez utiliser jusqu'à huit textures pour faire de l'alpha blending. Cela peut être utile dans certain cas, étant donné que cela vous permet de modifier l'alpha pour chaque niveau de texture.

Le mutli texturing peut être utilisé pour réaliser des effets sympas, je vous conseille donc de vous amuser un peu avec. Mais ce qui est encore plus important, c'est que cette technique va vous permettre d'utiliser des effets de shader. Restez attentif, car le prochain tutorial va véritablement avoir un niveau avancé. Vous allez apprendre comment utiliser vos propres effets de shader avec Ultimate 3D. Il est difficile d'écrire ses propres shaders mais il faut absolument que vous essayiez. Il existe de très bons tutoriaux sur Internet et une fois que vous saurez comment écrire vos propres shaders, plus rien ne pourra vous arrêter. Ils peuvent être utilisés pour n'importe quels effets imaginables. En gros, un pixel shader prend la place de l'opération de texture. Cela signifie que vous pouvez utiliser autant d'opérations arithmétiques que vous le souhaitez pour réaliser des calculs avec les valeurs des différentes textures. Vous pouvez réaliser n'importe quel effet que vous souhaitez créer. C'est la solution ultime pour tous les effets spéciaux dont vous avez besoin ;).



© Christoph Peters. Certains droits réservés. (Traduction FR 04/2008, Franck Vernel / Damien Buhl).

Creative Commons License XHTML 1.0 Transitional