Les images EXR lentes à ouvrir en compo, la solution
Par Narann le mardi, 8 mars 2011, 22:11 - Infographie 3D - Boulot - Lien permanent
Si vous avez déjà rendu des images EXR dans Maya (et d'autres logiciels/moteurs de rendu) vous avez peut être remarqué qu'elles peuvent être très longues à ouvrir dans votre logiciel de compo favoris (Nuke, Fusion, After Effect, etc...). La faute à la "façon" dont sont écrits les pixels dans vos images. :reflechi:
Avec ce billet, je vous propose une petite explication sur le comment du pourquoi ainsi que la méthode pour optimiser vos fichier EXR afin de gagner du temps lors de la phase de compo. (Merci à Deex pour ses informations)
Sommaire
Le format OpenEXR
Features (yeah yeah!)
Le format OpenEXR, qui existe depuis quelques années maintenant, s'est imposé petit à petit pour devenir le format d'image CG de référence.
Ses avantages sont indéniables:
- Open Source (sans ça il n'aurait clairement jamais décollé) :siffle: .
- Plusieurs précisions de pixel possibles.
- Un grand nombre de formats de compression.
- Multichannels de différents types.
- Images en scanline ou "tile" (c'est ce qui va nous intéresser).
- Mipmap ou Ripmap.
- etc... (pour plus d'informations, je vous invite à lire le pdf Technical Introduction to OpenEXR)
Mais sa capacité à "tout" faire, peut le rendre complexe d'un point de vue utilisateur.
Eux y(x) sert à tout faire!
J'suis mort avec rire avec mon minable jeu de mot là! :baffed:Oui, le format EXR n'a pas pour seul objectif d'être utilisé pour des images rendues. Il peut aussi être utilisé en tant que texture. C'est précisément pour cette raison qu'il dispose de fonctionnalités tel que mipmap et "tile".
Je ne réexplique pas à quoi sert les mipmap, je l'ai déjà fait dans un billet précédent.
En revanche, je ne crois pas avoir donné de précisions sur le "tile". Je vais donc rapidement expliquer le principe.
Le tile
Explication
Le principe du tile est de sauver les images par petits paquets (des buckets). Si vous avez lu mes billets sur les maps mental ray vous devriez comprendre assez vite l’intérêt.
Le plus simple pour comprendre la raison d'être du "tile" est par l'exemple.
Supposons que vous fassiez des textures en 8192x8192 et que vous en ayez des centaines dans votre scène. :grenadelauncher:
Imaginez ensuite que dans votre scène, vous ayez un mur en gros plan qui utilise un material composé de 5-6 textures (bump, specu tout çà):
Même avec les mipmaps, si votre mur est en gros plan, cela veut dire qu'il va devoir charger le niveau le plus haut de la map (8192x8192) pour chaque texture a utiliser (bump, specu...), et ce, même si on ne voit qu'une petite partie de la texture.
L'idée ici est de bien comprendre qu'on ne va pas les mettre dans la ram...
Et bien la solution est de découper l'image (ou dans le cas des mipmaps, chaque niveau des mipmaps) en petits bucket (en général 64x64) qui seront chargés indépendament du reste de l'image (ou du "niveau" dans le cas des mipmaps).
Dans notre exemple du mur, il ne chargera que les paquets de pixels à utiliser. Evitant ainsi de charger tout le niveau de la mipmap.
Cette méthode permet de s'affranchir des limites de taille des textures dans les logiciels de rendus (Vous pouvez essayer, en mental ray, de faire des maps de 80000x80000, je l'ai fait, ça marche impec! :baffed: ).
V-Ray, qui supporte très bien cette feature offre une petite explication aussi ainsi qu'un outil pour convertir des images en EXR tiled.
Mental ray supporte également cette feature depuis longtemps. Et, avec le fichier .exr depuis Maya 8.5.
Maya Station, un blog maintenu par certains développeurs de Maya en parle un peu.
Le problème du tile
Bon, c'est cool ça mais on s'en fout, on veut calculer des images et les mettre dans un logiciel de compo et que ce soit rapide. :pasClasse:
Oui, sauf que le soucis est qu'il est impossible de sortir des images EXR en scanline des moteurs de rendu. La majorité écrivant dans leur buffer en tile justement (petite explication pour V-Ray ici).
La seule solution est de repasser ses images en scanline (les pixels sont à la queue leu leu) une fois le rendu terminé.
Et là, malheureusement, pas de recette miracle... Il y a très peu d'outils "faciles" qui vous permettent de bien gérer la conversion des images EXR. Pourtant, les méthodes "compliqués" ne manquent pas. :baffed:
Solutions
OpenImageIO
Une lib C++ codé par Larry Gritz (un mec pas connu...). Je vous invite à lire la page 3 du PDF de documentation qui donne toute les raisons historiques (et c'est une sacrés histoire).
Le site ne propose aucun "build" (fichier exécutable). Que des sources:
https://github.com/OpenImageIO/oiio
Cela dit, compiler la lib ainsi que ses petits utilitaires (notamment iconvert qui permet de passer facilement un exr en scanline) est très (très) simple sous linux. Il y a pas mal de dépendances mais ce n'est pas un soucis sur l'OS du manchot!
On récupère les sources, make et hop! C'est bon! :aupoil:
Sous Windows c'est une vraie tanné. :pafOrdi: Pourtant la page d'explication est clair. Mais une fois sur le terrain c'est une autre paire de manche(ot). :tux001:
Au début j'ai voulu faire les choses proprement en compilant le projet en 64bits. Mais il faut avouer que le nombre de dépendances n'aide pas et les binaires précompilés pour Windows ne sont disponible qu'en 32bits (notamment Boost qui n'est pas un truc particulièrement facile à compiler en 64bits sous Windows).
Bref, après quelques heures, j'ai compris que je n'y arriverai pas rapidement. J'ai donc laissé tombé et ai compilé en 32bits. Et ça a marché! :laClasse:
Je vous propose de télécharger les exécutables Win32 compilé par mes soins: OpenImageIO_bin.7z
N'hésitez pas à tester chacune des applications. Elles vous rendront surement de fiers services en prod.
Passer un EXR tiled en scanline
C'est assez simple:
iconvert.exe -v --scanline monExrTile.exr monExrScan.exer
Et voilà! :sourit:
Les compressions
En fouillant un peu dans le code (que je trouve très clair au passage) et dans la doc (qui ne semble pas complétement à jour), page 84, on peut trouver les paramètres de compressions suivants:
- none: Aucune compression.
- zip: Compression zlib, par blocs de 16 scanlines.
- zips: Compression zlib, par blocs d'une seule scanline.
- rle: Compression "Run Length Encoding"
- piz: Piz-based wavelet compression.
- pxr24: Compression (avec perte) en 24bit flottant.
- b44: Compression (avec perte) par blocs de 4x4 pixels. Taux de compression fixe.
- b44a: Compression (avec perte) par blocs de 4x4 pixels. Les blocs ayant peu de variations sont mieux compressés.
Ainsi, il suffit d'utiliser:
iconvert.exe -v --compression zips --scanline monExrTile.exr monExrScan.exr
Pour avoir un exr en scanline et compressé. :)
Je n'ai pas testé avec des exr multicouche mais je pense qu'il doit le gérer.
Cette solution est pour moi la meilleur. :marioCours:
Batcher le logiciel de compo
La plupart des logiciels de compo (Nuke, Fusion, etc...) sont capable d'exporter correctement des EXR avec plusieurs channels et une compression correcte, en scanline.
Il n'y a pas de secret, il faut tester et voir si tout ce qu'on souhaite garder est bien présent dans le fichier. Une fois que vous avez une méthode qui tient la route, gardez là! :D
Si vous vous débrouillez bien, vous pouvez scripter chacun de ces softs pour qu'il réenregistre automatiquement vos images exportées de votre moteur de rendu en des EXR scanline. Ainsi vous pouvez lancer la conversion de tout les EXR d'un dossier en ligne de commande directement après la sortie des images. Bien qu'un peu lourde à mettre en place, c'est une solution très efficace et assez utilisé en prod. :sourit:
La grosse contrainte est qu'elle nécessite une licence de votre logiciel de compo par batch (ça fait chère la licence du "converter").
Vray
Je vous ai parlé de l'outil tools_img2tiledexr qui permet de convertir des image en EXR tilé, principalement pour les textures.
Mais il existe également un outil qui permet de convertir des vrimg (le format d'image de Vray) en EXR scanline: tools_vrimg2exr
Conclusion
Si vous trouvez vos fichiers EXR lents dans vos logiciels de compo, "passez les à la moulinette"! :joue:
Je compte enrichir ce billet au fur et à mesure si je trouve des choses plus précises (script, méthode, applications...).
Donc n'hésitez pas à laisser un commentaire si vous savez quelque chose qu'il pourrait être intéressant d'ajouter! :seSentCon:
Commentaires
Salut Fred,
Pour rendre mes images en EXR destinaient à l'animation dans After Effect , dans 3ds Max 2011 , je choisis donc le mode Scanline et non Tiles ok ,, je choisis aussi l'image Region en Full ok , mais pour la compression ? Quel est le meilleur ? 3ds Max en propose 7.
Moi c'est Dorian ^^
En effet, quand on peut sortir du scanline, il faut le faire (si c'est possible, le logiciel "repasse" sur l'image qu'il vient de sortir pour la "scanliner". Tous n'offre pas cette feature).
Concernant la compression. Le mieux est de ne pas en avoir. Mais c'est très vite lourd (32bit float par channel ça monte vite).
N'utilisant pas 3DsMax, je ne sais pas quelle compressions il propose.
Le choix dépend des cas mais la plus efficace (meilleur ratio vitesse/poids) est surement la Zlib compression 16 lines. Si c'est trop long, passer en 1 line.
A bientôt! :)
Dorian
Max propose les compressions (Sans) , RLE , scanline ZIPS, scanlineZIP, PIZ, PXR24, B44 fixRate, B44 , En effet ta méthode est beaucoup plus souple que le Tiles qui est la compression par défaut de Max. je viens de rendre mes pass avec la compression scanline ZIPS et la méthode Storage Type sur scanlines et c'est vrai que dans After Effect c'est beaucoup plus léger .. Merci et encore un bon sujet :)
Je crois que ZIPS c'est 16 line et que ZIP c'est 1 line.
Je ne suis pas sur, c'est ce que j'ai trouvé en fouillant un peu dans les codes EXR de certains projet.
"Tiled" n'est pas une compression mais une façon d'ordonner les pixels dans le fichier (on peu avoir du tiled non compressé).
Content que ce billet t'ais aidé. :)
C'est un peu un casse tête entre poids du fichier et temps de décompression. Est-ce que d'autres librairies de co/dec Exr (genre proexr) changent de beaucoup la vitesse de lecture des images Exr ?
Oulà! Il n'y a pas vraiment de "codecs" différents pour EXR. ProEXR utilise la lib OpenEXR, comme tous. Donc une seule vitesse.
Il n'y a pas des énormément de types de compressions différentes.
Ce qui fait la différence c'est surtout l'arrangement des pixels dans le fichier.
Tout ce qui lit de l'EXR le lit, à priori à la même vitesse que n'importe quel autre soft. :)
Hello,
Il semble que sur Maya MR 2012
quelqu'un peu confirmer ?
merci
A ce que j'ai pu lire, la compression ZIP n'est disponible que pour les exr en scanline, j'aimerais bien pouvoir avoir confirmation aussi sur ce point.
Je viens de verifier avec irfan view un exr sortie en zip de mental ray, il m'indique dans compression "ZIP Blocks", donc ça m'as pas l'air bon en fait, si qq1 peut repondre à la question de bruno, je serait aussi interessé.
Bon ne tenez pas compte du message precedent, je suis fatigué moi ce matin :P J'ai envie de dire que MR sort donc du scanline 16 bloc lorsque l'on sort les exr compressé en ZIP ? je vais continuer mes recherches a ce sujet...
Je viens de vérifier avec rv sur un exr sortie de mental ray 3.9.1.47 (Maya 2012):
EXR/TileDescription/roundingMode: ROUND_DOWN
EXR/TileDescription/mode: ONE_LEVEL
EXR/TileDescription/ySize: 32
EXR/TileDescription/xSize: 32
EXR/LineOrder: INCREASING_Y
EXR/compression: ZIP_COMPRESSION
Une chose est sur, c'est du Tiled, Zip 1 line (En cas de 16 lines ça aurait été ZIPS_COMPRESSION).
On dirait donc qu'on peut faire du bucket zippé. :)
Pareil ici avec RV en fait, donc a priori faudra attendre pour avoir du scanline en natif en sortie de MR...
Je ne suis pas sur que ça arrive un jour... VRay passe par un post process.
C'est quelque chose de facilement faisable en prod, même pour MR.
Pour que Vray écrive une image Exr scanline, il faut coché "use memory frame buffer". Comme ça, a la fin du rendu, Vray va écrire un second exr scanline, effacer le 1er exr tiled, puis renommer le fichier.
"Vray va écrire un second exr scanline, effacer le 1er exr tiled, puis renommer le fichier."
as-tu tester si combien ça plombe les temps de rendu ?
"si combien"? ;)
La conversion tiled2scanline est rapide (quelques secondes).
Si ta frame met 10/20min a se rendre c'est négligeable.
Salut Dorian, super utilitaire, sauf que j'ai une erreur qui me fait planter le truc avec un exr multichannels sortit de MR 2012... :( impossible de convertir l'exr en scanline.
Il me sort ca comme erreur :
..\..\src\libOpenImageIO\imageoutput.cpp:173: Failed assertion 'contiguous && "Per-channel output requires contiguous strides"'
Si tu pouvait me dire ou est le soucis ca serait bien cool ! Merci encore pour tous tes petits tips et outils bien mortels ;)
Hello Atrakt.
La version d'OpenImageIO que j'ai compile commence a dater et peut être que ce soucis est résolu dans la dernière version.
Je ne te cache pas que j'ai pas mal galéré a le compiler sous Windows (sous Linux ça prend dix minutes a tout casser, recup des dépendances comprises...).
De plus, je n'ai plus le projet Visual Studio (et tout le reste) donc je ne pourrais pas proposer de nouvelles versions... :(
J'ai regarde un peu le code:
https://github.com/OpenImageIO/oiio... (ligne 325) et j'ai la sensation qu'OIIO essai de d’être cohérent mais que ce qu'il reçoit n'est pas conforme...
Difficile de dire si le soucis vient de Maya qui exporte mal l'exr ou de OIIO... :(
Bon courage cela dit! :D
Deja, merci pour ta réponse claire et rapide!
Je vais essayer de trouver une solution, au pire je ferais ca dans nuke...
Merci encore! :)
Bonjour Narann.. Bon, je sais, j'arrive un peu en r'tard.. Rien qu'un an et d'mi, ça vaa,;).. Du coup, je vais tenter de poser ma p'tite question en croisant les doigts pour que tu me répondes, qui sait?..;).. En fait, pour faire simple, je suis graphiste sur mac et je dois retravailler dans Nuke un rendu Maya, composé d'une dizaine de renders layers au format exr ( associés à mes lights ) .. Je sais que ceux-ci, une fois cumulés dans Nuke, vont ralentir énormément le logiciel.. J'étais donc à la recherche de la solution magique pour alléger ma composition jusqu'à ce que je découvre sur ton site cette méthode tombée du ciel permettant de convertir et compresser facilement des fichiers exr, type tile, en fichier exr, type scanline... Youpi ! Sauf que j'ai bien essayé de "builder" le OiiO ( après avoir téléchargé "Cmake" comme demandé ) et en suivant scrupuleusement toutes les instructions.. Mais gros flop. Je bloque et je pige vraiment pas la manip. J'ai cherché partout et dans toutes les langues des tutos et des step by step!.. En vain.. Le sujet est très peu abordé et je finis par perdre espoir.. Pourtant, à te lire ( " On récupère les sources, make et hop! C'est bon!" ), ça a l'air tellement simple !.. N'ayant pas l'habitude de "rebuilder" des open source, je suis donc revenu ici, cher Narann, afin de savoir si c'était possible de connaitre ( un peu plus en détail ) les différentes étapes pour installer l'utilitaire et convertir mon exr.. Ça me sauverait grave la mise !!!.. Sinon, beh ma dernière solution sera d'acheter Mentalcore qui apparemment possède l'option "compression exr" en mode scanline.. Mais whaooo, 200 euros, ça me fait trop cher l'option !!!!;) .. Bref, je croise toujours les doigts! Merci quand même d'avoir pris le temps de me lire et quoiqu'il en soit, bonne journée, l'ami !.. Salutations;) Renaud
Salut Renaud,
Non, compiler un logiciel quand on ne l'a jamais fait c'est un peu comme utiliser une tablette pour la première fois: On enchaine les rate avant d'arriver a un truc d'un temps soit peu correct (la tablette ayant au moins la politesse de ne pas te lancer des phrases bizarre comme peut le faire un compilateur).
Bref, tu remarquera aussi le simley avec la gueule casse pour expliquer que cette phrase est un peu ironique. :D
En fait, oui, compiler OIIO sous Linux se fait assez simplement (Et de manière plus général compiler un truc dans Linux est quelque chose d'assez simple)
Il faudrait que tu me dise quel message il t'affiche. A tu regarde cette page.
Sinon tu peut toujours ouvrir ton image dans Nuke et la réexporter (C'est la seconde solution propose dans le billet). :)
r-Hello Narran et vraiment merci pour ton fast retour ! Et pi, je viens juste de percuter sur le smiley a la gueule cassée .. Vu comme j'ai galèré, ça m'a fait trop marrer !!! ;)..Sinon, en réponse à ta question au sujet du message qu'il m'affiche, beh, shame on me, j'shuis même pas arrivé à l'étape du message d'erreur vu que j'pige même pas comment faut l'allumer, cette "tablette".. ;) Mais ta solution d'ouvrir mon image dans Nuke et de la réexporter me plait bien et m'ira certainement mieux que de manipuler des lignes de codes. Et comme tu dis, une fois qu'on a trouvé la méthode, y'a bon !.. Bref, je m'y penche dés demain pour voir quoi c'est comment qu'on fait;).. Là, je vais cocher "une bonne nuit de sommeil" pour me reloader le haut. Encore merci pour ta réponse.. Je repasse te tenir au jus. .. Et le césar du meilleur scripteur est attribué à... ! Renaud.
Bonjour,
Tout d'abord un grand merci pour ce billet qui m'a bien bien éclaircie sur le sujet. Donc, par l'invite de commande windows, j'ai réussi à convertir un fichier de tile à scanline, mais je ne sais absolument pas comment on peux faire pour "appliquer" ce convertisseur à une liste de fichier... Je suis infographiste, pas développeur ;) merci de l'aide !
Dsl du retard. Je vois que tu a trouve une solution que je me permet de partager pour ceux et celles qui auraient le même problème que toi:
FORFILES /m *.exr /C "cmd /c c:\OpenImageIO\iconvert.exe -v --scanline @file @fname.exr
Bonjour,
Merci pour cet article amusant à lire :).
Ce-là fait un moment que je me pose une question pour alléger mes scripts Nuke en pré-calculant des parties d'arbo (Il s'agit là de rush live, non pas de rendu 3D). Voici ma question :
Est ce que le type de compression utiliser ont un poids significative dans la lecture des softs ou peuvent-ils être ignorer ? Je détails.
- Le Zip 1 ou 16 scalines fait ressortir un bug dans Nuke, des lignes mal calculés, lors du travaille de l'image (rien de visible en rendu final).
- Du coup j'ai tester la compression PIZ 32 qui offre un bon ration de compression et sans perte. Mais je me demande si sa n'alourdie pas le calcule.
Merci d'avance.
Hello UmeSiyah!
A mon avis, les artefacts que tu vois ne sont pas du a la compression mais soit au caching Nuke soit un bug dans les drivers de ta carte graphique.
1) Tente de vider ton cache Nuke
2) MAJ les drivers de ta carte graphique et regarde si tu peu desactiver le GPU dans les options Nuke pour voir si l'artefact disparait
En espérant que ça t'aide. :)
Bon courage!