Nan je déconne! :D Il existe une solution alternative et intéressante : les textures DirectDraw Surface (ou DDS). Sans rentrer dans les détails, je vous explique déjà comment Maya fait quand on lui donne, par exemple, un BMP (on rit pas, je prends un cas simple).

Forcément, si tu prends un BMP, c'est lourd!

Héhé... Sachez que, que ce soit un JPG, un TGA, un BMP, Maya ouvre la texture, la décompresse, la lit et place tous les pixels dans la mémoire de la carte graphique pour l'afficher. C'est énorme et très lourd à supporter pour la-dite carte qui dans un logiciel de 3D fonctionne très différemment que dans un jeux vidéo où le calcul des tailles des textures est millimétré. L'astuce que je vous propose consiste à utiliser un format de fichier texture que la carte graphique connait... le format DDS !

Dintendo DS!

Le format DDS, c'est quoi ? Pour faire simple disons que c'est un peu le JPG de la carte graphique. C'est la société S3 Graphics qui a développé les premières cartes supportant la compression-décompression des textures en hardware (la Savage 3D). Cette technologie fut ensuite implémentée dans Directx (6.0) et se propagea très rapidement (les possibilités offertes pour l'époque étaient révolutionnaire pour le jeux vidéo). La compression est destructive (on s'en fout pour un viewport vous me direz), mais l'image est stockée compressée dans la mémoire et décompressée "à la volée". Il y a plusieurs façons de créer une image dds à partir d'un autre format. La plus simple (mais vous allez voir qu'on est limité par cette simplicité) étant selon moi d'utiliser XnView : On ouvre, "Outils/Convertir" puis DDS (Il ne génère cependant pas les mipmap). J'ajouterai une dernière chose, c'est que ce que XnView fait, nconvert le fait aussi :D . Il est donc possible de convertir ses images en ligne de commande (pratique en production).

Voici la ligne de commande BAT:

nconvert.exe -out dds -o "monFichier.dds" "monFichier.bmp"

Simpliste non? Et bien en fait pas tout à fait ! Il faut savoir une chose quand on fait ce genre de manipulation, c'est que les images doivent avoir des tailles puissance de 2 (512x512, 1024x256 est possible aussi). En jeux vidéo, cette contrainte est primordiale et est donc prise en compte dès le début du projet. En précal', les softs gérant assez bien ce genre de problèmes, on se fout un peu de savoir si les textures sont carrées et (ou) puissance de quoi que ce soit. Il faut donc être rigoureux là-dessus. Si vous ne le faîtes pas, Nconvert va prendre automatiquement la première puissance de 2 (128, 256, 512 etc...) supérieure à la résolution de l'image et remplir le reste de noir. Ce qui rend la position de l'image par rapport à ses uvs faussée. La technique consiste donc à déformer l'image (ça peut sembler paradoxal mais quand on y réfléchit et qu'on teste un peu, c'est logique) en la resizant manuellement dans la taille du "bloc multiple" le plus proche. Personnellement et dans un souci de simplifier le tout, je mets toutes les images en 1024 par 1024 qui est un bon compromis (Cela dit, si vous avez le luxe de pouvoir resizer les maps au cas par cas ne vous gênez pas (C'est vrai que c'est dommage de resizer une map 1310x100 en 1024x1024, c'est vous qui voyez, faut pas se brosser non plus, c'est de la préviz). Voila donc une ligne de BAT possible:

nconvert.exe -rflag orient -resize 1024 1024 -rtype lanczos -out dds -o "monFichier.dds" "monFichier.bmp"

image01.jpg Bon, vous connaissez maintenant les grandes lignes de la manipulation.

Pas d'alpha, pas de chocolat

Si vous avez testé avec une image contenant un canal alpha, vous aurez peut-être remarqué que Maya l'interprète différemment (dans mon cas, l'alpha de mon image est censé être son inverse). image02.jpg L'alpha semble être interprété sur les bords. Je ne sais pas si le problème vient de Maya ou XnView mais il est bien présent. Il y a cependant plusieurs façons de le contourner.

Nvidia Pawa

logo nvidia Heureusement qu'ils sont là ceux là. En effet, Nvidia propose pas mal d'outils destinés aux développeurs. Ceux qui nous intéressent sont les textures tools et plus précisément les DDS Utilities. Téléchargez les, installez les et allez récupérer le fichier "nvDXT.exe" qui est un convertisseur en ligne de commande (il est placé dans le dossier d'installation). Ce programme à bon nombre d'options que je ne vous expliquerai pas ici (je me contente de laisser les paramètres par défaut), je préfère rester concis (vous pouvez toutefois, si le cœur vous en dit, lire le PDF inclut).

Grosso modo, la ligne de commande est la même que pour nconvert:

nvdxt.exe -file maMap.tga -output maMap.dds

image03.jpg

Sympa n'est-ce pas? ;)

Je viens aussi (en direct live!) de me rendre compte que les images ayant des tailles qui ne sont pas des puissances de 2 passent très bien ! (Un petit warning mais la conversion se fait)

image04.gif image05.jpg

Bon, je suis pas sûr que ce soit très propre tout ça, je vous donne aussi la commande qui resize l'image en 1024 par 1024:

nvdxt.exe -prescale 1024 1024 -RescaleKaiser -file maMap.tga -output maMap.dds

Encore une fois, pour une explication des options, lisez le PDF. J'ai aussi l'impression que l'option -prescale ne fonctionne pas sur des images de grandes tailles (8192 par 8192 par exemple).

Houai, mais n'empêche que ça pue tes lignes de commande toutes noires!

Ne vous inquiétez pas! Nvidia a pensé aux attardés personnes n'étant pas à l'aise avec les applications en ligne de commande (Je rigolais hein? Je me sers beaucoup de l'outil qui va suivre car il est plus pratique pour visualiser ce qui se passe dans l'image). Ainsi, ils ont sorti un plug-ins Photoshop qui permet également de créer des normal maps à partir de maps de bump (en niveau de gris).

Une fois de plus, je ne vais pas m'étaler (l'objectif étant de sortir des dds, pas de tout vous expliquer, la documentation Nvidia est d'ailleurs très bien faite et je vous invite à la lire si le sujet vous intéresse).

J'espère que ce billet vous aura servi ou vous servira à l'avenir. N'hésitez pas à tester chez vous et à laisser un commentaire si vous avez rencontré des problèmes, si vous pensez que je suis trop vague dans mes explications ou que vous avez la conviction que j'ai écris une énormité.

Pour ceux qui ont déjà utilisé les dds en production, je serai également intéressé de connaitre les limites de ce format ou les contraintes qu'il peut générer.

A bientôt!

Dorian

MAJ 2011 - 09 - 11

Bon, ça fait un moment que ce billet est écrit mais je fait une MAJ car j'ai pas mal potassé le sujet depuis et j'ai fait deux vidéos.

La première (septembre 2010) présente Maya affichant 4 maps dds de 8k. Mais pour être honnête, je soupçonne que ce n'était la bonne solution car c'est Maya qui envoi les maps dans le GPU:

Après m'être acharné à trouver de l'aide sur Area, j'ai finalement obtenu une réponse.

Mais il fallait que je test pour être sur. C'est donc chose faite: Pour profiter correctement du format dds, il faut utiliser un shader cgfx. Dans l'exemple qui suite, Maya peut afficher, sans broncher, 9 maps dds de 8k.

Et encore, là j’utilisai une compression DXT5 (qui prends le double de place que la DXT1). Donc à priori (il faut que je retest), je dois pouvoir afficher 18 maps dds de 8k dans le viewport Maya :baffed: .

La grande classe! :laClasse: