Texture:Texture Virtuelle

De Celestia wiki

Histoire

Blue marbble tx 3968 908.jpg

Les textures virtuelles permettent à Celestia d'afficher des textures qu'il n'aurait jamais été possible de rendre sur un PC en les découpant en "tuiles" (en anglais : "tiles"). Seules sont donc chargées en mémoire et affichées celles apparaissant à l'écran. Dépassant aujourd'hui couramment les 128k de résolution, l'idée à l'origine était bien plus modeste : pouvoir utiliser les textures Blue Marble 32k fournies par la NASA, alors qu'avec les cartes graphiques d'aujourd'hui on arriverait presque à le faire en brut.

Cette technique est apparue avec la version 1.3.1 de Celestia (cf. le topic de Chris Laurel sur le forum officiel).

Fonctionnement

Il faut tout d'abord se remémorer le fonctionnement d'une texture : c'est une image rectangulaire dont la largeur est le double de la hauteur (comme un tatami !). Lorsqu'on parle d'une texture de 1k, cela signifie que sa résolution est de 1024 pixels en largeur, et de la moitié - soit 512 pixels - en hauteur. Le nombre de « k » correspond donc à la largeur de l'image en pixels divisée par 1024.

Le nombre de pixels permis pour la hauteur et la largeur d'une image doit toujours être une puissance entière de 2.

Les textures virtuelles fractionnent cette résolution, tout en conservant les proportions.

Nous allons donc utiliser de plus petites images pour opérer ce fractionnement. Ce seront nos fameuses « tuiles ».

Les tuiles

Puisque nous allons fractionner notre texture, il est judicieux de se demander quelle sera la taille des plus petits morceaux possibles (les tuiles).

Tout comme les côtés de la texture d'origine, ceux des tuiles doivent être des puissances entières de 2.

De plus les tuiles sont théoriquement carrées. Si jamais elles ne l'étaient pas, Celestia ferait comme si elles l'étaient. En pratique, le recours à des tuiles rectangulaires est exceptionnel.

On trouve couramment des textures virtuelles à base de tuiles de 512, 1024 ou 2048 pixels de côté.

Les petites tuiles permettent de faire fonctionner la texture virtuelle sur des ordinateurs modestes dont la carte graphique n'est pas capable d'avaler de plus gros morceaux. Par contre un ordinateur moderne et puissant sera obligé de charger un nombre plus important de fichiers pour afficher une image et gaspillera du temps en allant les chercher sur le disque dur.

Pour la suite de l'article nous déciderons d'utiliser des tuiles de 512 sur 512 pixels afin que notre texture soit accessible à ceux qui pensaient déjà changer d'ordinateur il y a cinq ans mais qui ne s'y sont toujours pas résolus. ;-)

Revenons à notre texture à « virtualiser ». On se souvient qu'elle est rectangulaire dans un rapport de 2 en largeur sur 1 en hauteur.

Avec notre tuile qui fait 512x512, on voit que la plus petite texture possible fait 1024x512 pixels (1k).

Nous avons simplement coupé notre texture en 2 morceaux. Voyons ce qui se passe avec des textures plus détaillées.

Nous prendrons l'exemple réaliste d'une texture de 32k.

Avec notre tuile de base de 512*512 pixels, il faudra la couper en 64 dans la longueur et en 32 dans la largeur ce qui nous fait déjà 64*32=2048 tuiles.

Si nous avions utilisé des tuiles de 2048x248 pixels nous n'aurions été obligés de couper la texture qu'en 16*8=128 tuiles (fichiers) seulement. A condition que notre carte graphique accepte cette taille de tuile (et c'est le cas pour la majorité des ordinateurs actuels) nous faisons une grosse économie sur les temps de chargement.

Cette méthode revient à appliquer un fractionnement que nous appellerons horizontal, puisque se contentant de partitionner l'existant en plusieurs morceaux. poker gratuit

Tout cela est très impressionnant. Mais si je coupe ma planète en 2048 morceaux et que j'arrive de l'espace, je verrai un hémisphère complet et il faudra quand même que j'affiche la moitié des morceaux. Tous ces morceaux (1024) devront être lus un par un par l'ordinateur et recombinés pour former la texture que notre carte graphique devra afficher. De plus, la taille totale des morceaux sera très supérieure à celle qu'il aurait été utile de charger. Notre prétendue astuce n'a fait qu'empirer les choses !

Par contre, ce serait intéressant si nous étions tout près de la planète. Dans ce cas il n'y aurait qu'une petite partie de la surface totale à afficher et notre astuce de découpage pourrait se révéler efficace.

La deuxième astuce, à combiner à cette première, nous l'appelleront le fractionnement vertical, qui utilise la technique des Levels (niveaux).

Levels

L'idéal serait d'utiliser notre texture de 32k seulement lorsque la taille d'une tuile affichée à l'écran correspond à la taille de la tuile réelle. Nous aurons ainsi à charger le minimum de tuiles et nous profiterons au maximum de la précision de notre texture.

Si on s'éloigne de la planète et qu'à l'écran les tuiles sont affichées avec une taille de seulement 256 pixels au lieu de 512, on pourra se contenter d'une texture de 16k au lieu de 32k. Et ainsi de suite en utilisant des textures de moins en moins précises.

Nous partons donc du principe que vu de loin, une faible résolution suffit alors que de près (ou avec un fort zoom) il nous faudra utiliser la plus haute résolution disponible (32k dans notre exemple).

Le fractionnement vertical en niveau consiste à fabriquer toutes les textures depuis la plus basse résolution possible jusqu'à la plus précise (32k). De cette façon Celestia pourra choisir celle qui est le mieux adaptée à la situation.

La plus petite texture possible sera constituée de 2 tuiles mises côte à côte.

Avec nos tuiles de 512 pixels de côté, cette texture mesurera donc 1024*512 soit 1k.

Ce sera notre texture de niveau 0 que nous allons mettre dans un répertoire qu'il est obligatoire de nommer level0. Il y a donc toujours 2 tuiles dans le level0. Par contre la taille de la carte correspondante (ici 1k) dépend de la taille choisie pour la tuile.

Après le level0 passons au level1. Il contient une carte dont les côtés sont le double de ceux du level0. Il aura donc 2*2=4 tuiles en largeur et 2*1=2 tuiles en largeur. Soit 8 tuiles en tout. Puisque le niveau précédent contenait une carte de 1k et que nous avons doublé la taille des côtés, nous avons une carte de 2k à ce niveau.

Nous répétons ce processus jusqu'à atteindre un niveau qui contienne une carte de taille 32k.

En résumé :

 niveau  Tuiles en
largeur
Tuiles en
hauteur
Nombre de
tuiles
Taille de la carte pour
des tuiles de 512 pixels
0 2 1 2 1k
1 4 2 8 2k
2 8 4 32 4k
3 16 8 128 8k
4 32 16 512 16k
5 64 32 2048 32k

Nous voyons avec ce tableau que l'ensemble de notre texture virtuelle sera répartie sur 6 niveaux (level0 à level5). Le niveau 0 contient toujours 2 tuiles et chaque niveau contient quatre fois plus de tuiles que le précédent.

Le nombre de tiles d'un level n complet peut se calculer par la formule suivante : 22n+1

À titre de curiosité, le nombre total de tuiles pour une texture virtuelle complète jusqu'au niveau n peut se calculer ainsi :

Nombre total de tuiles = 2/3 * (4n+1 -1)

Depuis la version 1.4, [/celestia/wiki/index.php/Celestia Celestia] accepte jusqu'à 13 niveaux de fractionnement horizontal (soit du "level0" au "level12"). Pour information, un level12 complet comporterait donc plus de 33,5 millions de tiles !

Niveaux complets ou incomplets

Celestia calcule le niveau optimal à afficher en fonction principalement de la distance et de l'angle de vue (zoom).

Si par exemple Celestia décide que le niveau correct est le niveau 12 et qu'à cet endroit il n'y a pas de tuile de ce niveau, il ira afficher la tuile correspondante du premier niveau inférieur disponible.

Tuile vatican.jpg

Nous avons ici des niveaux complets jusqu'au niveau 5 et seulement une tuile (la cité du Vatican) au niveau 12.

Dès qu'on atteint les bords de la tuile, Celestia affiche le niveau 5 dont la définition par rapport à celle du niveau 12 (1/128) n'est pas suffisante pour afficher autant de détails et produit cet effet de flou prononcé.

L'intérêt de pouvoir utiliser un niveau incomplet réside dans le fait qu'on peut ainsi avoir une très grande précision sur une surface limitée.

Par exemple le niveau 12 correspond (toujours avec une tuile de 512px) à une carte de 4096k. S'il était complet, il devrait contenir 33554432 tuiles soit autant de fichiers.

Personne ne dispose d'une telle carte pour l'ensemble d'une planète. Mais on peut très bien imaginer que l'ensemble de la planète soit entièrement représentée au niveau 5 avec des détails au niveau 7 sur certains pays, au niveau 9 pour des régions et à des niveaux de 10 ou 11 pour des villes qui pourraient elles-mêmes avoir des détails jusqu'au niveau 12. En utilisant des tuiles de taille plus importantes on peut encore augmenter la précision des détails au niveau le plus élevé.

Cela ouvre la voie à des vues rapprochées ou close-ups.

Un exemple de fabrication d'une telle vue est expliquée à la section Tutoriels

Utilisation

Il est nécessaire d'indiquer à Celestia que la texture qu'il va devoir afficher est une texture virtuelle. Cela se fait par le biais d'un fichier Ctx obligatoire.

Structure des dossiers de textures virtuelles

Bien qu'il soit possible d'utiliser d'autres schémas, les textures virtuelles devraient être considérées comme des addons et en respecter l'organisation.

L'exemple choisi est la description de l'implantation de la texture virtuelle 64k Earth Mark II de Jestr. On peut trouver cette texture sur Celestia Motherlode à la section Earth: surface maps.

Pour info il s'agit d'une texture de 64k avec des tuiles de 1024x1024. Elle est donc répartie en 6 niveaux nommés level0 à level5.

Voici l'organisation typique des dossiers de textures virtuelles.

VT structure.png

Les fichiers de l'addon

Puisque nous avons décidé qu'il était préférable d'utiliser une texture virtuelle comme un addon, nous allons créer un répertoire d'addon dédié à notre texture virtuelle. Dans notre cas ce sera JMII DDS - addon. Parmi les méthodes possibles, une des plus intelligentes consiste à déclarer notre texture en tant que "surface alternative".

Nous allons donc créer dans ce répertoire (JMII DDS – addon) un fichier JMII DDS.ssc qui va se charger d'indiquer à Celestia quelle texture doit être affichée comme une "surface alternative". Voir FICHIERS SSC pour plus de détails à ce sujet.

Nous voyons sur le schéma ci-dessus le contenu minium de ce fichier. Un coup d'oeil nous montre que notre texture sera le fichier "JMII DDS.ctx"

Le fichier ctx

Pour pouvoir utiliser notre texture virtuelle comme une autre texture, il nous faut un fichier qui représente cette texture et qui va se placer comme tous les autres fichiers de texture dans un des sous-répertoires (hires, medres, lores) du répertoire des textures. Ce fichier aura l'extension ctx et sera considéré par Celestia comme un fichier graphique au même titre que les fichiers jpg, png ou dds. Comme les textures virtuelles sont faites pour afficher de grosses textures, il est logique de le placer dans le répertoire hires. On peut voir dans l'illustration ci-dessus un exemple du contenu d'un fichier ctx.

La ligne qui nous intéresse particulièrement ici est ImageDirectory "JMII DDS". Elle indique le nom du répertoire qui contiendra réellement les images de notre texture virtuelle.

Une explication détaillée des différentes lignes de ce fichier est donnée dans le chapitre sur les fichiers ctx.

Le répertoire des textures virtuelles

Le nom de ce répertoire est pointé par le fichier ctx décrit ci-dessus.

Ce répertoire doit être un des sous-dossiers du répertoire textures\hires. Sa seule fonction est d'accueillir les répertoires nommés level0, level1 ...jusqu'à level12 qui contiennent les tuiles de la texture virtuelle regroupées par niveau.

Les répertoires "level" et les tuiles

Ces répertoires sont nommés de level0 à level12. Il n'est pas obligatoire que tous les niveaux soient présents.

Le contenu d'un de ces répertoires ressemble à ceci :

Vt Level1.png

Nous voyons ici le contenu du répertoire level1. C'est un niveau complet qui contient 8 tuiles comme cela a déjà été développé plus haut.

Dans notre exemple les niveaux 0 à 5 sont complets ce qui représente 2730 tuiles en tout.

Vt Level12.png

Le niveau 12 ne peut pas être complet pour des raisons pratiques évidentes (beaucoup trop de tuiles). Ici nous voyons qu'il ne contient qu'un seul fichier qui (comme son nom l'indique) correspond à une vue rapprochée de la Cité du Vatican.

Le nom des tuiles est imposé par Celestia. Il est de la forme :
tx_colonne_ligne.extension

L'extension doit être jpg, png ou dds et décrit le format graphique. La colonne et la ligne sont numérotées à partir de zéro. Ce nom permet à Celestia de placer correctement la tuile en question sur la planète.

Localisation des tuiles

À un moment ou à un autre on sera amené à se poser une de ces questions :

  • Si j'ai une tuile qui s'appelle tx_4379_1094.dds, à quel endroit sur Terre cela correspond-il ?
  • Si je veux fabriquer une vue rapprochée du clocher de mon village, dans quelle tuile va-t-il se retrouver ?

Pour représenter la géographie d'une planète, Celestia utilise une projection cartographique connue sous le nom de projection cylindrique équidistante

Dans ce système, les méridiens (qui mesurent la longitude) ainsi que les parallèles (qui mesurent la latitude) sont représentés par des lignes droites parallèles et équidistantes. Les méridiens coupent les parallèles à angle droit et dans Celestia la longueur sur la carte d'un degré de longitude est égale à la longueur d'un degré de latitude.

Cela conduit à un découpage en carrés qui s'adapte parfaitement au découpage en tuiles décrit précédemment.

Vt planisphere.jpg

La figure ci-dessus représente les 128 tuiles réglementaires correspondant au niveau 3 (level3).

Les chiffres en noir correspondent au numérotage des tuiles et les chiffres en bleu sont les coordonnées géographiques en latitude et longitude. Les longitudes Est sont positives et les longitude Ouest sont négatives.

À ce niveau (level3) chaque tuile correspond à une étendue de 22,5° de longitude sur 22,5° de latitude.

Par exemple le coin nord-ouest de la tuile qui représente la partie sud-ouest de l'Australie a pour coordonnée :

Longitude 112,5° est
Latitude -22,5° soit 22,5° sud

Nous voyons que cette tuile est sur la colonne X=13 et la ligne Y=5. En supposant que le format graphique soit dds, elle figurera dans le répertoire level3 avec le nom tx_13_5.dds.


Formules qui donnent la position (et donc le nom) d'une tuile du niveau n en fonction de la longitude et de la latitude :

Colonne X = E( (1 + long/180) * 2n )
Ligne   Y = E( (90 – lat)/180 * 2n )
 
La notation E(x) représente ici la partie entière de l'expression entre parenthèses

Les formules suivantes font le travail inverse. Elles calculent la position géographique d'une tuile en fonction de sa position (ou de son nom).

Étendue d'une tuile en degrés de latitude et de longitude au niveau n

Étendue = 180/ 2n
Longitude et latitude du coin nord-ouest pour une tuile sur la colonne X et sur la ligne Y au niveau n
 
Longitude = 180.X / 2n – 180
Latitude  = 90 – 180.Y / 2n