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.
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:
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:
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.
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.
GetMaterialIndex(
MaterialName
)
|
---|
MaterialName
Le nom du matériau dont vous voulez récupérer l'indice.
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.
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.
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:
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).
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.
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
}
// Le parallax mapping et le bump mapping ne sont pas supportés
} |
---|
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:
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.
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.
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).