Fr/convertir un avion en dds

From FlightGear wiki
Jump to navigation Jump to search

conversion des textures d'un avion en DDS

c172p en version 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

dds-conversion

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:

c172 version png


Version DDS:

c172p version dds

en vue plus large:

c172p en version dds

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 ...