Accueil » Rédactions » Jeux vidéo : Les contraintes du mapping et des matériaux

Jeux vidéo : Les contraintes du mapping et des matériaux


Par David Lanier – www.dl3d.com






1. Introduction : connaître les contraintes de la plateforme cible !


Un jeu vidéo est destiné à tourner sur des plateformes cibles : Microsoft XBox, Sony Playstation 2 ou PSP, Nintendo Gamecube(NGC) ou DS etc… Il faut connaître les contraintes des ces consoles pour les matériaux et le mapping pour que vos modèles 3D puissent s’afficher correctement. Nous n’aborderons pas ici les contraintes spécifiques à la DS, la PSP ou la NGC.




2. Contraintes sur les matériaux, shader et textures


Avant tout, vous devez savoir quelle est la part allouée pour les textures dans la mémoire, ceci découle d’une discussion avec le chef programmeur qui doit avoir budgétiser ce point en méga-octets. Généralement, nous limiterons le plus possible le nombre de textures par objet. Si possible une seule texture, appelée skin, par objet, voire 2 quand l’une d’elles à une couche alpha. Nous faisons ceci afin d’éviter d’envoyer à l’affichage plein de petits morceaux d’objet de quelques triangles puisque les primitives (= groupe de triangles) sont triées, entre autres, par matériau.

© Copyright Cyril Moreul



2.1. Shaders


Aujourd’hui, tous les GPU sont programmables et les shaders temps réel sont devenus incontournables. A partir de shaders, vous pouvez assigner sur vos modèles des effets et les combiner. Les langages de création de shaders temps réel sont parmi CG de Nvidia, HLSL de Direct X, OpenGL 2.0 shading language et RenderMonkey d’ATI. Les logiciels de modélisation 3D vous permettent d’afficher certains de ces shaders dans le viewport en temps réel. Gardez à l’esprit qu’appliquer de multiples shaders sur beaucoup d’objets rajoutera une qualité visuelle indéniable mais fera aussi baisser le framerate du jeu…

Le coût framerate d’un vertex shader est intimement lié au nombre de faces/sommets de l’objet et il est assez facile de savoir ce que cela va coûter de l’ajouter dans la scène. C’est plus difficile pour un pixel shader, car celui ci a un coût qui est fonction du nombre de pixel rendu à l’écran… I.e. il faut considérer que si l’on peut s’approcher de l’objet jusqu’à se coller à lui, il puisse remplir tout l’écran et là, le coût du pixel shader peut devenir prohibitif. Donc quand l’on crée un objet, il faut toujours le faire en ayant une idée précise de son utilisation dans le jeu.

© Copyright Cyril Moreul



2.2. Charte graphique


Afin d’assurer une cohérence tout au long d’un niveau et du jeu lui-même, les textures doivent être choisies judicieusement en fonction d’une charte graphique précise.



2.3. Format


La contrainte la plus importante pour le mapping temps réel, vient du format des textures choisies. De ce format d’image va dépendre la place mémoire dans la console qui va être utilisée.
Certaines plateformes possède leurs propres algorithmes de compression de textures qu’il vous faut donc utiliser. Par exemple, la XBox et le PC possèdent sous Direct X la compression S3TC (mise au point par S3) utilisée sous le nom de DXTC. Les cartes graphiques ATI et NVidia, entre autres, sont équipées de compresseurs/décompresseurs hardware S3TC. Le S3TC est un algorithme de compression d’image très simple mais très efficace, il compresse au maximum avec une taille 6 fois inférieure, son principal défaut est d’être destructif, bien que dans la plupart des cas, cela ne se voie pas. Il vaut mieux dans certains cas avoir une texture en 512×512 en DXTC plutôt qu’une 256×256 en RGB car la 512 en DXTC apparaîtra de meilleure qualité.


Un des autres formats de textures le plus utilisé pour la production graphique dans le temps réel est le TGA 24 ou 32 bits (32 bits => avec une couche alpha). Il est non destructif et permet de compresser les textures qui ont beaucoup de pixels de la même couleur (Algorithme de type RLE) ce qui marche bien pour les textures de jeux vidéo mais ne marche généralement pas bien sur les textures photo réalistes. Mais comme il n’y a pas de gestion RLE en hardware on utilise ce format pour la production sous les logiciels 3D mais pas dans la console car cela prend beaucoup de mémoire. Ce format dans la console est transformé en DXTC ou en bitmap palettisé.

Pour la Playstation 2, le DXTC n’est pas utilisé car il n’y a pas de hardware capable de le décompresser. Les textures en production sont du TGA et ce format est transformé en texture en 256 couleurs avec une palette ARGB. C’est ce qui fait que l’on peux avoir des textures avec dégradé de transparence…
Mais on ne peut pas éditer de palette ARGB sous Photoshop… En général l’artiste fait une texture en 32 bits et une moulinette convertit automatiquement en palette ARGB pour la PS2 en appliquant certains filtres en preprocessing. On ne gardera que très rarement une texture 32bits sur PS2 (taille mémoire prohibitive). il faut bien garder à l’esprit que le filtrage bilinéaire au moment du rendu de la texture va rajouter de la qualité au dégradé. Donc les textures 32 bits transformées en palette 256 ARGB donnent de bons résultats. Le défaut majeur est que le rendu final sera plus « flou » que la texture originale. Il est donc conseillé d’ajouter du contraste par détail par un filtre Photoshop avant la conversion ou dans la moulinette directement.

Le JPEG n’est que très peu utilisé car il compresse très bien mais introduit aussi des artifices visibles par son algorithme de compression par bloc… Il est cependant utilisé pour optimiser dans des cas précis comme pour avoir 45Mo de light maps compressées en RAM en 9Mo de texture JPEG. Mais comme la décompression n’est pas faite en hardware, elle prend beaucoup de temps sur une PS2 et n’est donc pas tps réelle, donc à ne faire qu’entre changements de zone avec fade au noir car elle peut durer plus d’une seconde.

© Copyright Daniel Roger


 

 

2.4. Résolution


Pour satisfaire les contraintes de l’affichage hardware sur console ou sur PC, les textures doivent toutes avoir une hauteur et une largeur en puissance de 2. Sur Direct X par exemple, si vous lui donnez une texture qui n’est pas une puissance de 2, il allouera une texture en puissance de 2 et y placera votre texture, vous perdrez donc de la VRAM …

Sur XBox et PC vous avez moins de contraintes pour la résolution de vos textures que sur PS2 car la place mémoire de la console est plus grande et cette mémoire de 64Mo est de la VRAM directement. Généralement on peut monter jusqu’à du 512 x 512 en DXTC voire du 1024 x 1024 pour les objets cruciaux du gameplay comme le personnage dans un jeu avec une vue à la 3e personne.

Pour une PS2, le format recommandé maximum sur un objet sera du 256×256 en ARGB palettisé 8 bits. Si la hauteur et la largeur des textures PS2 ne sont pas identiques, il est recommandé d’avoir une texture plus large (horizontalement) que haute pour des raisons de mise en page mémoire dans la PS2.

Attention aussi à veiller à ce que la résolution des textures soit adaptée à la taille réelle de l’objet. Il ne faut pas utiliser une 256 x 256 pour mapper un petit verre sur une table J Et il faut tenir compte aussi de la distance objet / caméra moyenne du jeu.




2.5. Filtrage


Même si certaines textures vous apparaissent trop « pixélisées » sous votre éditeur 2D de textures (généralement Adobe Photoshop), il faut les voir dans le moteur de jeu et pas seulement sous votre éditeur 2D ni sous le modeleur 3D. Le moteur de jeu, quel qu’il soit, appliquera un filtrage de la texture. Généralement, un filtre bilinéaire est appliqué en hardware sur PS2, XBox, NGC, PC… Donc la texture apparaîtra plus floue. Le filtrage bilinéaire faisant perdre du contraste au moment du rendu, il est souvent intéressant de passer un filtre « Accentuation » sous Photoshop pour accentuer les différences afin de rester le plus proche possible de la texture originale. Une méthode pour avoir un simili filtrage bilinéaire sous Photoshop : doubler sa taille en lui appliquant un filtre bilinéaire puis remettre sa taille originale en lui appliquant le filtre bilinéaire, ça donne à peu près ce qu’on aura en hardware avec ce même type de filtrage. Il existe aussi d’autres méthodes de filtrage de texture comme le tri linéaire ou l’anisotropique mais le hardware n’est pas encore assez performant pour filtrer toute une scène avec ces algorithmes. Mais quand vous lirez ces lignes, ce sera peut-être maintenant possible.



2.6. Couche alpha


Il peut être important pour le gameplay et le côté visuel d’une map d’utiliser de la transparence dans les textures afin de rendre des objets transparents. On parle de la couche alpha pour la couche qui traite de la transparence dans une texture. Les moteurs de jeux supportent généralement tous les types de transparence avec une préférence pour les textures qui ont des valeurs d’alpha qui sont 0 ou 1 (dit alpha-test) mais pas de valeurs ente 0 et 1. Ce qui veut dire qu’un pixel est complètement transparent ou complètement opaque. Il existe des problèmes de tri des faces transparentes afin de rendre ces faces dans le bon ordre : back to front. Le format pour ces textures transparentes est à l’origine du TGA 32 bits qui est ensuite convertit en paléttisé ou DXTC.


© Copyright Daniel Roger


 

 

 

2.7. Mipmaps


Afin d’avoir une meilleure apparence des textures éloignées dans le champ de la caméra, nous utilisons des mipmaps d’une texture. Il s’agit de ne pas utiliser les textures de haute résolution (512×512) pour mapper un objet qui se trouve loin dans le champ de la caméra. Nous risquerions d’avoir notre texture appliquée sur un objet ne faisant au final que quelques pixels sur l’écran et ceci résultant en des effets peu appréciés dans un jeu comme du moiré. En utilisant des textures de taille plus petite nous gagnons aussi de la bande passante pour le transfert de textures en VRAM.
Pour cela, nous pouvons générer des niveaux de mipmaps de notre texture. Il s’agit de générer à partir de notre 512×512 une 256×256 puis une 128×128 puis une 64×64 etc.…Chaque niveau de mipmaps contenant la même texture à une résolution inférieure. Nous pouvons définir le niveau de mipmaps si nous souhaitons 2, 3 niveaux de diminution de notre texture. Lorsque l’objet est éloigné du champ de la caméra, le mipmaps de niveau juste plus petit sera utilisé sur l’objet au lieu de la texture originale, puis plus il s’éloigne du champ de la caméra plus nous utiliserons le niveau de mipmaps le plus petit en résolution. C’est le hardware qui gère la sélection du niveau de mipmaps.





2.8. Light Maps, shadowmaps


L’éclairage permet de rajouter de la crédibilité à une scène 3D, si nous le pouvions, nous utiliserions de la Global Illumination (GI), des caustiques, du subsurface scattering etc.… Le tout en temps réel !

Mais aujourd’hui, en 2004, ceci est encore très coûteux et quasi-impossible à faire en temps réel. Afin de rajouter un peu de et toi alors le crédibilité et d’éviter tous ces calculs de lumières, nous créons des textures superposées en multitexturing au décor actuel qui ne contiennent que les effets de l’éclairage (calculs d’ombres par exemple). Comme nos lumières sont, pour la plupart, fixes ces textures dites de light map peuvent être calculées en amont pendant la production du jeu et appliquées ensuite sur le décor. Ces textures n’ayant pas besoin d’une très grande précision au niveau du pixel, nous pouvons ici appliquer une compression de type JPEG qui introduira des artifices par sa compression par blocs. Par contre, il faut une grande précision au niveau du dégradé. Donc on ne peut pas trop compresser avec perte, c’est pour cela que les formats DXTC sont à déconseiller pour les light maps. Il vaut mieux avoir une light map plus petite en 24 bits qu’une light map plus grande mal compressée.

© Copyright Michel Roger



 

 

2.9. Nombre de textures par objet


Comme nous devons limiter le nombre de textures sur un modèle pour des raisons de taille en mémoire des textures et de bande passante de transfert de textures. Nous avons tendance à essayer de réunir les textures d’un objet en une seule texture de résolution plus grande. Pour que ceci soit possible, il ne faut pas avoir utilisé de répétition sur les UVs du modèle (i.e les UVs ne doivent pas avoir une largeur ou longueur supérieure à 1 sur tous les triangles du modèle.


3. Contraintes sur les coordonnées UVs

 

Les UVs doivent être placés judicieusement et l’aspect visuel n’est pas le seul élément à prendre en compte.
Les coordonnées UV doivent si possible être le plus souvent dans le carré [0,1]x[0,1], i.e, u et v doivent tous les 2 être compris entre 0 et 1. Il faut limiter le nombre d’UVs et les partager lorsque cela est possible afin que le modèle puisse être strippé.
Il vaut mieux aussi limiter le répétition sur les faces. Un répétition de 15 est généralement un maximum sauf sur PS2 où les contraintes sont encore plus fortes car toutes les coordonnées UVs multipliées par la taille de la texture doivent être comprise dans un intervalle de taille < 4096 !!! Vous pouvez choisir de rester entre 0 et 4096 ou certains choisissent de rester entre –2048 et + 2048. Vous avez le choix de l’intervalle. En clair, cela veut dire pour tous vos UVs, vous devez vérifier que leur valeur multipliée par la largeur ou hauteur de la texture est comprise dans votre intervalle. Exemple : pour une face, la valeur en U minimum sur un des sommets de votre face, par exemple 0, la valeur maximum par exemple 3. cela nous fait une longueur d’intervalle de 3 en U, vous multipliez ceci par la largeur de la texture appliquée sur cette face, par exemple 256 et vous obtenez 256*3 = 768. Dans ce cas, vous êtes dans l’intervalle mais la valeur trouvée doit rester inférieure à 4096 en U et en V pour une même face. Ce qui veut dire que pour rester dans ce range avec une texture de taille 256, vous devez limiter votre répétition à 16 car 16*256 = 4096…

© Copyright Michel Roger


Visuellement vos UVs peuvent être corrects mais vous avez pu utiliser des valeurs en U de 123 à 124 pour une même face ce qui revient au même visuellement qu’avoir un U entre 0 et 1 mais pour la PS2 cela ne s’affichera pas correctement car cela sortira de l’intervalle.
Il vaut mieux vérifier ces contraintes directement sous votre modeleur 3D ou lors de l’import dans le moteur de jeu.




4. Conclusion


Avec la nouvelle génération de consoles, ces contraintes vont sans doute pour la plupart devenir caduques. Mais il en restera sûrement d’autres dont il faudra tenir compte. Cependant les consoles actuelles sont loin d’être mortes et on leur prédit encore une longue vie…
L’utilisation des shaders va encore s’accentuer avec les nouvelles génération de GPU qui seront sur XBox2, PS3 et cartes graphiques PC et on espère voir venir des shaders de plus en plus complexes permettant d’accroître l’immersion de nos scènes temps réel. Et bientôt peut-être aura t’on des effets en temps réel du genre de ceux que l’on voit dans les films full 3D comme Shrek 2… L’arrivée récente des normal maps nous permet de le supposer…

© Copyright Michel Roger

 

 


5. A propos de l’auteur

 

David Lanier est développeur indépendant sous le nom commercial David Lanier 3D ®, il développe des outils, des plug-ins et des shaders sur commande. Plus d’informations sur son site web : https://www.dl3d.com  

 

 

 

 

Glossaire:

 

Modèle : représentation en 3D d’un objet (personnage, décor, …)
Vertex (au pluriel sommets) : point de l’espace en 3D qui est utilisé pour constituer un modèle.
Mapping : Action de plaquer une texture sur une face afin de lui donner une apparence plus réaliste.
Coordonnées UVs : Coordonnées pour réaliser le placement d’une texture sur une face.
Strip : Ensemble de faces avec le plus de données possibles partagées (ex : sommets, UVs)
Couche alpha : couche permettant de rendre plus ou moins transparente certaines partie d’une image.
Répétition : Fait de répéter une texture plusieurs fois horizontalement ou verticalement sur un face. Dans ce cas, on dit que la texture est tilée.
Alpha-test (ou quick alpha) : une texture ne contenant que des valeurs 0 (transparent) ou 1 (opaque) dans sa couche alpha est dite avoir une couche alpha de type alpha-test.
GI : Méthode permettant de calculer les interactions lumineuses se produisant entre les objets.
Caustiques : Focalisation des rayons lumineux lors du passage au travers d’objets transparents
Sub surface scattering : Les rayons lumineux entre dans un matériau et se dispersent dans ce dernier avant d’en ressortir. Exemple : du jade ou de la peau.

 

 

 


Remerciements
Merci à Sébastien DAVID (alias Gizmo),
Cyril MOREUL, Daniel ROGER et Michel Roger.

Chargement....

A Lire également