Contents |
Obtenir des textures efficaces
Les textures sont une partie essentielle du contenu 3D, elles permettent aux surfaces d'apparaitre avec plus de détails qu'une géométrie ne pourrait le faire seule dans une même catégorie de performance. Chacun sait qu'elle contrôle les couleurs, le motif, etc. qui apparaissent à la surface, et plus tard avec d'autres aspects des shaders comme la brillance, la normale des surfaces (important pour l'éclairage), et plus encore.
Ce guide suppose que vous connaissez quelques bases sur les textures et comment lier une texture à un matériau Crystal Space. Il contient des informations sur la façon de créer des textures efficaces et explique comment contrôler les aspects du rendu de texture, comme le format qui est chargé par la carte graphique.
Dimensions des textures
Le matériel 3D (mais aussi au niveau logiciel) peut effectuer un rendu des textures plus efficacement si les dimensions sont des puissances de 2 (par exemple : 256x256, 512x512), en allant plus loin, ce sont les APIs graphiques et matérielles qui requièrent des textures avec des dimensions en puissance de 2 (abrégée en "P2"), et donc pour toutes les textures Crystal Space 2D et 3D. Si vous utilisez une texture dans Crystal Space qui n'est pas P2, il la redimensionnera en interne dans une dimension P2 (par exemple : 640x480 deviendra 512x512). Le redimensionnement n'étant déjà pas très bon, la texture finira en sus, plus moche après rendu.
Mais, vous vous demanderez surement, "Le matériel moderne ne supporte-t-il pas les textures non-P2 ?" et bien oui, mais :
- Certains matériels ne le supportent pas encore.
- Elles ont des limitations (pas de mipmaps, les coordonnées des textures doivent être dans une autre échelle...).
En résumé : Utilisez des textures dimensionnées en puissance de 2.
Une autre facette est la taille qui doit être utilisée, cela dépend du contenu bien sûr. Quelques points sont à considérer :
- Le temps où certains matériels étaient limités aux textures en 256x256 est maintenant révolu. De nos jours, la limite se situe à 2048x2048 voire 4096x4096. La compression de texture permet d'utiliser des textures en haute résolution de manière performante, utilisez-les.
- Vous pouvez facilement réduire une texture lorsque vous la trouvez trop grande. L'agrandissement d'une texture que vous trouvez moche ou trop floue n'arrangera pas les choses, vous ne pouvez pas ajouter des informations là où il n'y en a pas. Ceci signifie qu'il est préférable de commencer avec des textures trop grandes plutôt que trop petites.
- Le rendu OpenGL permet une configuration utilisateur pour manipuler les textures en version basse résolution via le paramètre de configuration Video.OpenGL.TextureDownsample, vous n'avez pas besoin de vous soucier plus que ça des utilisateurs avec de faible mémoire vidéo, étant donné qu'ils peuvent accroitre leur performance en modifiant ce paramètre à une valeur supérieure à 0.
Format de fichier des textures
Une texture doit évidemment être stockée quelque part. Crystal Space supporte la lecture d'un grand nombre de formats d'image, tels que PNG, TGA, BMP, JPG, DDS, GIF, et d'autres moins communs ou plus exotiques comme le MNG et le JNG. Le choix du format va dépendre de considérations telles que la nécessité du canal alpha, la possibilité de compresser avec pertes ou l'espace disque utilisé. La profondeur de couleur n'est plus importante, Crystal Space utilise des textures en vraies couleurs quand il fait un rendu avec OpenGL, utiliser par exemple des textures avec des palettes de couleurs ne vous fait strictement rien gagner lors de l'exécution par rapport à des images en vraies couleurs.
Le canal alpha est supporté par les formats PNG, TGA, BMP, MNG, JNG, la compression est sans perte pour les PNG, GIF, TGA, BMP et peut être avec ou sans perte pour le MNG et le DDS. Le format MNG est un peu spécial du fait qu'il soit un format d'animation et est habituellement utilisé pour des textures animées.
Communément, le PNG et le TGA sont utilisés pour des textures avec transparence alpha, JPG pour des textures sans. Soyons sensés, vous pourriez dire "le PNG et le JPG couvrent tous mes besoins et leur compression est très bonne". Cependant le meilleur format actuel est le DDS.
Pourquoi ? et bien, examinons ce qu'il se passe si vous chargez un PNG dans Crystal Space :
- La texture est décompressée.
- Les mipmaps sont créées.
- La texture est envoyée au matériel.
Bien évidemment, l'étape 3 contient également une recompression. Celle-ci est dûe au fait que Crystal Space utilise des textures compressées (lesquelles ont des effets positifs sur les performances), mais les données de la texture sont envoyées à OpenGL en format RGB(A), ce qui signifie que le pilote a besoin de recompresser la texture, et ceci prend du temps.
Comment fonctionne le DDS ? dans les fichiers DDS, une image sera stockée dans le même format de compression que celui qu'utilise le matériel (DXT1, DXT3, DXT5), les textures mipmappées seront stockées également. Ceci signifie que les étapes 1 et 2 du dessus ne seront pas nécessaires, ainsi que la recompression à l'étape 3, donc les données précompressées seront simplement envoyées au matériel. Se débarrasser de tous ces processus améliore grandement le temps de chargement.
Et qu'en est-il de la taille des fichiers ? Sans canal alpha (compression DXT1), 4 bits par pixel sont nécessaires, avec un canal alpha (compression DXT3 et DXT5), 8 bits par pixels sont nécessaires. Ceci bien sur avant une compression en ZIP. La taille des fichiers DDS peut rivaliser avec celles des PNG et des JPG.
- Un plugin d'exportation pour Photoshop est disponible sur le site de Nvidia : NVIDIA Texture Tools.
- Un plugin pour Gimp est également disponible : GIMP DDS plugin.
Contrôle de qualité des textures
Comme mentionné ci-dessus, les textures dans Crystal Space sont compressées avant d'être envoyées à la carte graphique. Malgré la rapidité des textures compressées, il persiste quelques indésirables : par exemple pour les normalmaps (voir Bump Map Compression pour une illustration des problèmes).
Crystal Space permet de contrôler la qualité texture par texture à travers les Classes de Texture. Une Classe de Texture est une collection de paramètres contrôlant la manière dont une texture doit être envoyée au matériel graphique. Par exemple, les lookup, normalmap et nocompress impose que les textures soient stockées non compressées dans la carte graphique. De plus, les Classes de Texture lient certaines "sémantiques" aux textures, très utile pour les outils ou les personnes qui lisent le fichier World brut. La classe d'une texture peut être définie en ajoutant par exemple <normalmap/> au block <texture>.
Transparence
Crystal Space supporte deux types de transparence : alpha et binaire. Alpha vous permet d'obtenir une transparence adoucie, avec l'inconvénient que la géométrie avec de telles textures a besoin d'être arrangée de l'arrière vers l'avant pour l'afficher correctement. Aussi, il ne peut pas écrire dans le Z-buffer (par exemple, on ne peut pas utiliser le mode Z-buffer zuse) comme des zones transparentes seront écrites dans le Z-buffer (et par la suite occultées à tort les autres géométries).
La transparence binaire n'a pas ces désavantages, elle peut être utilisée sans aucun tri spécial ou mode Z-buffer. Cependant, comme son nom le suggère, vous obtenez des pixels soit complètement transparents soit complètement opaques.
Habituellement pour une transparence binaire, une keycolor (couleur clé) est définie sur la texture. En interne, la keycolor fonctionne de cette façon : on recherche tous les pixels identiques à la keycolor, la valeur de leur couleur est remplacée par une moyenne des pixels voisins différents de la keycolor (ou la moyenne de tous les pixels différents de la keycolor si aucun de ses voisins n'est opaque), et leur alpha est défini à 0. Le remplacement de couleur est effectué pour éviter des couleurs baveuses dûes au filtrage de texture, si cela ne serait pas fait, vous pourriez voir un halo rose autour des zônes transparentes (si la keycolor est rose).
Ceci signifie cependant qu'une image avec une keycolor doit être retravaillée avant d'être envoyée à la carte graphique. Par exemple, les étapes 1-3 sont toujours effectuées. Vous pouvez réaliser une transparence binaire plus efficacement si vous n'utilisez pas de keycolors, mais mettre à la place une transparence dans la canal alpha (et remplir la zone transparente avec une couleur qui ne bave pas). La transparence binaire peut être activée en ajoutant <alpha> <binary/> </alpha> au bloc <texture>.
Langage:
English •
Brazilian •
Chinese •
Español •
Esperanto •
Français •
Magyar
Make a translation