Fr/convertir un avion en dds
conversion des textures d'un avion en DDS
objectif
il est question ici d'un script bash (linux/mac) qui permet de convertir les textures d'un avion des data en .dds compressées. Ceci afin de gagner de la place en mémoire vive, et surtout d'avoir une bien meilleure fluidité au chargement des avion. Il y a par contre deux inconvénients, une occupation sur le disque dur plus importante (faut être prêts à certain sacrifices :) ), mais contrebalancé par le fait qu'une compression lors de la génération d'un tar.gz recompresse encore la texture. Il faut juste noter une incompatibilité avec certains drivers vidéo/GPU open sources, pour laquelle il existe un paquet permettant de les utiliser (libtxc-dxtn), ce qui soulève éventuellement un problème de licence (licence S3TC, la cause principale qui fait que FG n'est pas distribué en dds :( ).
outils de conversion
Si il existe un plugin pour gimp ou photoshop, on va utiliser un utilitaire de nvidia: nvcompress, ceci afin de tout faire sans ouvrir un éditeur d'image. Il n'est bien sur pas necessaire d'avoir une CG nvidia pour l'utiliser, mais il va beaucoup plus vite si il a un GPU nvidia CUDA à sa disposition.
pour l'obtenir, il existe plusieurs solutions:
Utilser votre gestionnaire de paquet, il s'agit de libnvtt-bin (sur debian)
ou en le compilant vous même, il suffit de se rendre ici:
gpu-accelerated-texture-compression
choisissez la version qui vous sied, pour notre cas les sources à compiler, puis on compile et on installe les binaire. il est important que nvcompress soit compilé pour votre processeur, avec les bonnes optimisations (et si possible cuda), je suis passé de 300s à 40s pour le texture.png du cub en bc3, en utilisant un nvcompress adapté :) .
Une note: suite à l'installation de nvcompress dans le systeme, OSG se plaint lors de sa compilation, sur mon PC j'ai commenté le test de nvcompress dans OSG (je mettrai la ligne une fois celle ci retrouvée).
soft utilisés
Rien que du classique pour un linux, en plus du bash:
- grep
- cat
- identify de imagemagick: va nous permettre de tester si l'image possède une couche alpha
- sed
- convert de imagemagick: utilisé pour retourner les images et en faire des .png avant de les passer à nvcompress
- find
- tar : pour faire un tar.gz de l'avion en dds ;)
- nvcompress (libnvtt-bin)
le script bash
personnellement, j'ai un dossier "dds", puis un sous dossier script" dans lequel j'ai installé le script, mais vous pouvez le mettre ou vous voulez, tant que vous savez l'appeler en ligne de code.
mode d'emploi
la conversion en dds est sujette à perte, contrairement au .png ou .rgb, le format dds compressé que l'on va utiliser est "lossy", il vaut mieux éviter d'effacer les textures d'origine, donc la méthode est la suivante: copier le dossier de l'avion qui vous interesse dans "dds", allez dans le dossier de l'avion, puis lancez le script (ex avec le c172p):
$cd dds/c172p dds/c172p$bash ../script/dds-conversion
Vous arrivez sur un menu:
faites votre choix: 1: chercher erreurs 2: convertir un dossier 3: generic 4: textures 5: weather 6: init base 7: materials 8: environment 9: effects 10: tar current folder 11: convert 1lvl 12: convert 2 lvl 13: manual selection 14: clean converted 15: fgdata conversion 16: AI conversion 17: plane conversion 18: apply generic dds 19: search for non dds call 20: create fgdata multi-thread 21: test 22: models 23: scenery 24: plane with generic dds 25: stereo to mono sound file conversion 26: create initial fgdata copy 27: copy selected planes 28: convert all the planes 29: texture bis 30: clean the converted fgdata your choice ?
L'entrée à utiliser est la 17 pour convertir un avion, en étant dans son dossier. Vous pouvez avant utiliser le "1" qui va chercher des erreurs, valable surtout si il y a des caractères "espace" dans les noms
Les autres entrées sont utilisées pour arriver à convertir les data en entier,avec l'ajout d'un dossier de configuration, des fichiers qui disent quoi ne pas convertir, garder, ou convertir en normal (cf ci dessous).
En premier on liste les fichiers (.jpg, .png et .rgb), puis on les trie en 4 catégories:
- ceux qui ne demande pas de modif (les splash screens), c'est fait avec une recherche sur le nom, donc certains peuvent passer au travers.
- ceux qui ont "normal" ou "nmap" dans le nom, on suppose alors qu'ils sont des normal maps.
- texture avec couche alpha
- textures sans couche alpha
A chaque fois il est possible d'utiliser des fichiers de config pour forcer une texture dans une cathégorie. Au cours de la conversion, on s'assure que les textures ont bien des tailles en puissance de 2, avec une transformation si ce n'est pas le cas. suivant le type de texture, il se passe:
- textures sans alpha: conversion en .png avec un flip, puis transformation en bc1 par nvcompress
- texture avec alpha: test si la couche alpha est pertinente,auquel cas .png et flip, puis conversion en bc3, sinon, on enlève la couche alpha et conversion en bc1
- normal map: inversion des couleurs de l'image (pour inverser les normales) avec un flip en .png , puis passage en bc5.
- splash: ben, rien on vous a dit ;)
à la suite de la conversion, le fichier original de la texture est effacé, et les extension .png des fichier sont remplacés par .dds dans les .ac et .xml, on va chercher dans tous les fichiers accessible à partir du dossier ou on a lancé le script, c'est pour cela qu'il faut se borner à un avion à la fois. Pour les normal map, on les affiche dans le contexte de leur fichier .eff, et on passe "normalmap-dds" à 1 dans les paramètres de l'effet, à condition que cette ligne soit présente d'origine, au moins dans le fichier d'effet parent. Pour le c172 c'est bon, mais il y aura sûrement des avions ou ce n'est pas le cas.
enfin c'est le moment de tester, en donnant à fg le chemin vers "dds" pour "--fg-aircraft".
pour information, sur un athlon 64x2 5000, il faut 3minutes pour convertir le c172p, avec un nvtt compilé, mais la version des paquets va sensiblement aussi vite.
Avec un peu de chance, ça marche du premier coup, sinon il faut bidouiller, ajouter la ligne pour les normal map, faire en sorte que les nomrmal map aient bien "nmap" ou "normal" dans le nom etc...
si vous voulez lancer le script dans une boucle, il est possible de lui passer le numéro en argument, par exemple pour l'ensemble des avions sauf "Generic":
ls -d */ | grep -v Generic | while read i; do cd $i; bash /path/to/dds-conversion 17; cd -; done
ceci va convertir l'ensemble des avions du dossier dds.
bug connu
si vous utilisez la version dds d'un avion à l'aide de l'option --fg-aircraft, et qu'il est aussi présent dans les data dans sa version originale, l'affichage des livrées par mp est alors cassé, et vous ne voyez les autres que dans la livrée par défaut. Une solution est de renommer temporairement le dossier original, en attendant que le dossier Aircraft soit séparé des datas ;)
conclusion
De cette façon, on retrouve le plaisir du mp sans les 20s de blocage du f16 ;), et on gagne de la ram, que demander de plus! Cerise sur le gateau, les normale sont mieux rendues, pour le c172p:
Version originale:
Version DDS:
en vue plus large:
Pour donner un ordre d'idée de l'occupation en ram, fgfs avec un c172p png occupe dans les 630M, et seulement 510M en version dds au décollage de LFLU, temps très peu nuageux et vue ext.
pour ceux qui sont sur un driver libre linux, ça marche aussi si on a installé libtxc-dxtn, (testé par contrainte avec radeon sur une hd4850)
Pour finir, un avertissement: n'utilisez pas la version dds d'un avion pour repporter des bug, des fois que la conversion soit en cause, pensez à tester avant le modèle des data non modifié.
jano
liste d'avions convertis "out of the box"
voici une petite liste des avions pour qui la conversion a l'air de bien se passer:
c172p, f-14b, A-10, A-6E, Cub ...
copie-conversion de fgdata
Pour le fgdata 2.12, il vous faut d'une part le script et d'autre part les fichiers de config
pour suivre un fgdata git, le projet est sur git: fg-dds git
pour faire une copie, puis une conversion en dds de fgdata, le mode d'emploi est le suivant:
- ouvrir le script, et faites pointer $FGROOT sur le dossier actuel fgdata
- créer un dossier ou se fera la copie, puis indiquez son chemin pour $BASE
- décompressez le dossier de configuration du script, et donner son chemin pour $CONFIG
celà donne par exemple, pour les lignes 7 à 9:
BASE=/rab/fgdata FGROOT=/stockage/logiciels/fg/fgdata CONFIG=/rab/config_dds
Pour le moment il y a dans le dossier de config:
- data_list: contient les noms des dossiers/fichiers de fgdata à copier, j'ai ici enlevé les dossiers Aircraft et Aircraft-uiuc, ne voulant pas un fgdata de 3G ... Si vous les voulez en entier, ajoutez les à vos risques et périls.
- plane_list: contient le nom des dossiers d'avions que vous voulez copier et convertir, il est limité pour l'instant à une très courte sélection d'avion, histoire d'accelerer la conversion. Ajoutez ce que vous souhaitez, et vérifiez qu'ils marchent convertis, il se peut que les normales maps ne soient pas bien rendues si la ligne suivante n'est pas présente dans les .eff originaux:
<normalmap-dds type="int"> 0 </normalmap-dds>
- des textures dds de Models/Weather, il s'agit de celles que la ligne de transformation sabote (couche alpha perdu sur un rgb en gris, du coup la conversion a été faite sous gimp, avant de les passer à nvcompress). Elles sont copiés lors de la conversion lorsque les rgb sont effacés.
- quelques fichiers pour dire quoi renommer avant la conversion, quoi garder sans conversion dans certainss dossiers etc.
Enfin il ne reste plus qu'a lancer le script qui va (en principe) copier les datas choisies, et les convertir en dds. il faut dans les 40 minutes pour un data tout dds sur un dual core un peu dépassé, et les datas obtenues font dans les 1.7G:
bash /chemin/vers/dds-conversion 20
Ce script fonctionne bien pour la version 2.12, ainsi que sur un data git à jour. On peut aussi le bidouiller un peu pour obtenir des texture avec une taille maximum, pour le cas de petites config, et/ou enlever Textures.high, voir les effets au complet.
l'effet se fait surtout sentir si les avions sont convertis en dds, lors de leur chargement, le reste des data en dds a je trouve moins d'influence.
bug
à découvrir ...