Dorian Fevrier's blog - Mot-clé - batchJe m’appelle FEVRIER Dorian, je suis infographiste 3D passionné par mon métier, l’informatique en général, l’internet, la programmation et l’évolution de tout ce petit monde. Vous trouverez sur ce blog des tutoriaux, mes coups de cœurs, avis, etc.2024-01-02T23:48:05+01:00FEVRIER Dorianurn:md5:695d9c73474c33ce3dab043823509c4bDotclearLes images EXR lentes à ouvrir en compo, la solutionurn:md5:9516d15e99cd0d9c4466e06f3f658bc22011-03-08T22:11:00+01:002013-07-26T18:11:52+02:00NarannInfographie 3D - Boulotastucebatchcompositingexrfichiersfrimf_copymental raymipmapnukeopen sourcetexturevray<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_03_08_images_exr_compo_lent/exr_logo_tn.png" alt="exr_logo_tn.png" style="float:left; margin: 0 1em 1em 0;" title="exr_logo_tn.png, mar. 2011" height="150" width="150" />Si vous avez déjà rendu des <a href="http://en.wikipedia.org/wiki/OpenEXR">images EXR</a> 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:</p>
<p>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 à <a href="http://deex.info">Deex </a> pour ses informations)</p> <center>:longBar:</center>
<h3>Sommaire</h3>
<ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#le_format_exr">Le format OpenEXR</a>
<ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#features">Features</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#eux_yx_sert_a_tout_faire">Eux y(x) sert à tout faire!</a></li>
</ul></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#le_tile">Le tile</a>
<ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#explication">Explication</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#le_probleme_du_tile">Le problème du tile</a></li>
</ul></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#solutions">Solutions</a>
<ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#openimageio">OpenImageIO</a>
<ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#passer_un_exr_tiled_en_scanline">Passer un EXR tiled en scanline</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#les_compression">Les compressions</a></li>
</ul></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#batcher_le_logiciel_de_compo">Batcher le logiciel de compo</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#vray">Vray</a></li>
</ul></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#conclusion">Conclusion</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/09/Les-images-EXR-lentes-a-ouvrir-en-compo-la-solution#liens_utiles">Liens utiles</a></li>
</ul>
<center>:longBar:</center>
<h3>Le format OpenEXR <a name="le_format_exr"></a></h3>
<h4>Features (yeah yeah!) <a name="features"></a></h4>
<p>Le format <a href="http://www.openexr.com/">OpenEXR</a>, qui existe depuis quelques années maintenant, s'est imposé petit à petit pour devenir le format d'image CG de référence.</p>
<p>Ses avantages sont indéniables:</p>
<ul>
<li>Open Source (sans ça il n'aurait clairement jamais décollé) :siffle: .</li>
<li>Plusieurs précisions de pixel possibles.</li>
<li>Un grand nombre de formats de compression.</li>
<li>Multichannels de différents types.</li>
<li>Images en scanline ou "tile" (c'est ce qui va nous intéresser).</li>
<li><a href="http://en.wikipedia.org/wiki/Mipmap">Mipmap ou Ripmap</a>.</li>
<li>etc... (pour plus d'informations, je vous invite à lire le pdf <a href="http://www.openexr.com/TechnicalIntroduction.pdf">Technical Introduction to OpenEXR</a>)</li>
</ul>
<p>Mais sa capacité à "tout" faire, peut le rendre complexe d'un point de vue utilisateur.</p>
<h4>Eux y(x) sert à tout faire! <a name="eux_yx_sert_a_tout_faire"></a></h4>
<small><i>J'suis mort avec rire avec mon minable jeu de mot là! :baffed:</i></small>
<p>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".</p>
<p>Je ne réexplique pas à quoi sert les mipmap, je l'ai déjà fait dans <a href="https://www.fevrierdorian.com/blog/post/2009/12/24/Les-maps-mental-ray-%28part-2.1%29%3A-Le-debug">un billet précédent</a>.</p>
<p>En revanche, je ne crois pas avoir donné de précisions sur le "tile". Je vais donc rapidement expliquer le principe.</p>
<center>:longBar:</center>
<h3>Le tile <a name="le_tile"></a></h3>
<h4>Explication <a name="explication"></a></h4>
<p>Le principe du tile est de sauver les images par petits paquets (des buckets). Si vous avez lu <a href="https://www.fevrierdorian.com/blog/post/2009/01/14/Le-mappage-en-m%C3%A9moire-des-textures-dans-Mental-Ray-expliqu%C3%A9-%28Memory-mapped-textures%29.">mes</a> <a href="https://www.fevrierdorian.com/blog/post/2009/12/13/Les-maps-mental-ray-%28part-1%29%3A-Pratique">billets</a> sur les maps mental ray vous devriez comprendre assez vite l’intérêt.</p>
<p>Le plus simple pour comprendre la raison d'être du "tile" est par l'exemple.</p>
<p>Supposons que vous fassiez des textures en 8192x8192 et que vous en ayez des centaines dans votre scène. :grenadelauncher:</p>
<p>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 çà):</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_03_08_images_exr_compo_lent/camera_mur_exemple001.png" alt="camera_mur_exemple001.png" style="display:block; margin:0 auto;" title="camera_mur_exemple001.png, mar. 2011" height="338" width="500" /></p>
<p>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.</p>
<p>L'idée ici est de bien comprendre qu'on ne va pas les mettre dans la ram...</p>
<p>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).</p>
<p>Dans notre exemple du mur, il ne chargera que les paquets de pixels à utiliser. Evitant ainsi de charger tout le niveau de la mipmap.</p>
<p>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: ).</p>
<p>V-Ray, qui supporte très bien cette feature <a href="http://www.spot3d.com/vray/help/maya/150R1/tiled_exr.htm">offre une petite explication</a> aussi ainsi qu'<a href="http://www.spot3d.com/vray/help/200R1/tools_img2tiledexr.htm">un outil</a> pour convertir des images en EXR tiled.</p>
<p>Mental ray supporte également cette feature depuis longtemps. Et, avec le fichier .exr <a href="http://forum.mentalimages.com/showthread.php?t=4186">depuis Maya 8.5</a>.</p>
<p><a href="http://mayastation.typepad.com/maya-station/2009/07/imf_copy-and-exr-format.html">Maya Station</a>, un blog maintenu par certains développeurs de Maya en parle un peu.</p>
<h4>Le problème du tile <a name="le_probleme_du_tile"></a></h4>
<p>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:</p>
<p>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 <a href="http://www.vfxjobs.com/forum/showthread.php?t=23087&p=113506">ici</a>).</p>
<p>La seule solution est de repasser ses images en scanline (les pixels sont à la queue leu leu) une fois le rendu terminé.</p>
<p>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:</p>
<center>:longBar:</center>
<h3>Solutions <a name="solutions"></a></h3>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_03_08_images_exr_compo_lent/.126062425745_m.jpg" alt="126062425745.jpg" style="display:block; margin:0 auto;" title="126062425745.jpg, mar. 2011" height="434" width="560" /></p>
<h4>OpenImageIO <a name="openimageio"></a></h4>
<p><img src="https://www.fevrierdorian.com/blog/public/logos/oiioLogo.png" alt="oiioLogo.png" style="display:block; margin:0 auto;" title="oiioLogo.png, mar. 2011" height="135" width="135" /></p>
<p>Une lib C++ codé par <a href="https://secure.wikimedia.org/wikipedia/en/wiki/OpenImageIO">Larry Gritz</a> (<a href="http://en.wikipedia.org/wiki/Blue_Moon_Rendering_Tools">un mec</a> <a href="http://www.imdb.com/name/nm0342691/">pas connu</a>...). Je vous invite à lire la page 3 du <a href="https://github.com/OpenImageIO/oiio/raw/master/src/doc/openimageio.pdf">PDF de documentation</a> qui donne toute les raisons historiques (et c'est une sacrés histoire).</p>
<p>Le site ne propose aucun "build" (fichier exécutable). Que des sources:</p>
<p><a href="https://github.com/OpenImageIO/oiio" title="https://github.com/OpenImageIO/oiio">https://github.com/OpenImageIO/oiio</a></p>
<p>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!</p>
<p>On récupère les sources, make et hop! C'est bon! :aupoil:</p>
<p>Sous Windows c'est une vraie tanné. :pafOrdi: Pourtant <a href="http://openimageio.org/wiki/index.php?title=Building_OpenImageIO_on_Windows">la page d'explication</a> est clair. Mais une fois sur le terrain c'est une autre paire de manche(ot). :tux001:</p>
<p>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).</p>
<p>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:</p>
<p>Je vous propose de télécharger les exécutables Win32 compilé par mes soins: <a href="https://www.fevrierdorian.com/blog/public/billets/2011_03_08_images_exr_compo_lent/OpenImageIO_bin.7z">OpenImageIO_bin.7z</a></p>
<p>N'hésitez pas à tester chacune des applications. Elles vous rendront surement de fiers services en prod.</p>
<h5>Passer un EXR tiled en scanline <a name="passer_un_exr_tiled_en_scanline"></a></h5>
<p>C'est assez simple:</p>
<pre class="bash bash">iconvert.exe <span style="color: #660033;">-v</span> <span style="color: #660033;">--scanline</span> monExrTile.exr monExrScan.exer</pre>
<p>Et voilà! :sourit:</p>
<h5>Les compressions <a name="les_compression"></a></h5>
<p>En fouillant un peu <a href="https://github.com/OpenImageIO/oiio/blob/master/src/openexr.imageio/exroutput.cpp">dans le code</a> (que je trouve très clair au passage) et <a href="https://github.com/OpenImageIO/oiio/raw/master/src/doc/openimageio.pdf">dans la doc</a> (qui ne semble pas complétement à jour), page 84, on peut trouver les paramètres de compressions suivants:</p>
<ul>
<li><em>none</em>: Aucune compression.</li>
<li><em>zip</em>: Compression zlib, par blocs de 16 scanlines.</li>
<li><em>zips</em>: Compression zlib, par blocs d'une seule scanline.</li>
<li><em>rle</em>: Compression "Run Length Encoding"</li>
<li><em>piz</em>: Piz-based wavelet compression.</li>
<li><em>pxr24</em>: Compression (avec perte) en 24bit flottant.</li>
<li><em>b44</em>: Compression (avec perte) par blocs de 4x4 pixels. Taux de compression fixe.</li>
<li><em>b44a</em>: Compression (avec perte) par blocs de 4x4 pixels. Les blocs ayant peu de variations sont mieux compressés.</li>
</ul>
<p>Ainsi, il suffit d'utiliser:</p>
<pre class="bash bash">iconvert.exe <span style="color: #660033;">-v</span> <span style="color: #660033;">--compression</span> zips <span style="color: #660033;">--scanline</span> monExrTile.exr monExrScan.exr</pre>
<p>Pour avoir un exr en scanline et compressé. :)</p>
<p>Je n'ai pas testé avec des exr multicouche mais je pense qu'il doit le gérer.</p>
<p>Cette solution est pour moi la meilleur. :marioCours:</p>
<h4>Batcher le logiciel de compo <a name="batcher_le_logiciel_de_compo"></a></h4>
<p>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.</p>
<p>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</p>
<p>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:</p>
<p>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").</p>
<h4>Vray <a name="vray"></a></h4>
<p><img src="https://www.fevrierdorian.com/blog/public/logos/vray_logo.gif" alt="vray_logo.gif" style="display:block; margin:0 auto;" title="vray_logo.gif, mar. 2011" height="120" width="200" /></p>
<p>Je vous ai parlé de l'outil <a href="http://www.spot3d.com/vray/help/200R1/tools_img2tiledexr.htm">tools_img2tiledexr</a> qui permet de convertir des image en EXR tilé, principalement pour les textures.</p>
<p>Mais il existe également un outil qui permet de convertir des vrimg (le format d'image de Vray) en EXR scanline: <a href="http://www.spot3d.com/vray/help/150SP1/tools_vrimg2exr.htm">tools_vrimg2exr</a></p>
<center>:longBar:</center>
<h3>Conclusion <a name="conclusion"></a></h3>
<p>Si vous trouvez vos fichiers EXR lents dans vos logiciels de compo, "passez les à la moulinette"! :joue:</p>
<p>Je compte enrichir ce billet au fur et à mesure si je trouve des choses plus précises (script, méthode, applications...).</p>
<p>Donc n'hésitez pas à laisser un commentaire si vous savez quelque chose qu'il pourrait être intéressant d'ajouter! :seSentCon:</p>
<center>:longBar:</center>
<h3>Liens utiles <a name="liens_utiles"></a></h3>
<ul>
<li><a href="http://www.vfxjobs.com/forum/showthread.php?t=23675">multichannel exr and speed</a></li>
<li><a href="http://www.vfxjobs.com/forum/showthread.php?t=23870">tile vs. scanline exr</a></li>
<li><a href="http://www.pigsfly.com/forums/index.php?showtopic=6318">Very Slow Exr Read Speed</a></li>
<li><a href="http://www.vfxjobs.com/forum/showthread.php?t=20984">EXR bucket to EXR scan line</a></li>
<li><a href="http://www.excamera.com/sphinx/articles-openexr.html">Un binding OpenEXR en ptyhon</a> et <a href="http://excamera.com/articles/26/doc/index.html">sa documentation</a></li>
</ul>Les maps mental ray (part 3): Fabriquer sa map de debugurn:md5:6dc26d3ecd617ba8cd524f38d3ffbfe72010-01-31T22:16:00+01:002013-07-26T22:34:32+02:00NarannInfographie 3D - Boulot3ds maxbatbatchbidouilledebugfrimf_copymapmayamental ray<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_creer_map_debug/map_mental_ray_create_tn.png" alt="map_mental_ray_create_tn.png" style="float:left; margin: 0 1em 1em 0;" title="map_mental_ray_create_tn.png, janv. 2010" height="150" width="150" />Pour clore ce chapitre sur les maps de mental ray je vais expliquer la démarche pour en créer une spécialement dédié au debug. Comme vu <a href="https://www.fevrierdorian.com/blog/post/2010/01/30/Les-maps-mental-ray-%28part-2.2%29%3A-Le-debug">précédemment</a>, l'idée est d'avoir une map avec différentes images à chaque niveaux. Ce qui permet de mieux régler les options de filtrage de texture lors d'un rendu et/ou de débugger le comportement des textures. Ce billet est le plus court des trois. :hehe:</p> <p>Une fois encore, tout le mérite revient à <a href="http://fr.linkedin.com/in/pierrelopes" hreflang="en">Pierre LOPES</a> qui m'a fait "découvrir" le principe de la "map de debug".</p>
<p>Pour générer une .map, comme d'habitude, il faut utiliser l'utilitaire <a href="https://www.fevrierdorian.com/blog/post/2009/01/14/Le-mappage-en-m%C3%A9moire-des-textures-dans-Mental-Ray-expliqu%C3%A9-%28Memory-mapped-textures%29.#imf_copy">imf_copy</a>.
Allez le chercher dans:</p>
<pre class="bash bash">C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe</pre>
<p>Comme vu dans l'aide <a href="https://www.fevrierdorian.com/blog/post/2009/01/14/Le-mappage-en-m%C3%A9moire-des-textures-dans-Mental-Ray-expliqu%C3%A9-%28Memory-mapped-textures%29.#imf_copy_traduction">précédemment</a>, il va falloir utiliser le flag "-c" suivi de la liste des images de la plus grande à la plus petite:</p>
<pre class="bash bash">imf_copy <span style="color: #660033;">-v</span> <span style="color: #660033;">-r</span> <span style="color: #660033;">-c</span> test.0.png test.1.png test.2.png ...etc... myDebugMap.map</pre>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_creer_map_debug/.map_mental_ray_create001_m.jpg" alt="map_mental_ray_create001.png" style="display:block; margin:0 auto;" title="map_mental_ray_create001.png, janv. 2010" height="156" width="448" />
Important, pour éviter les problèmes du genre:</p>
<pre class="bash bash">MAIN <span style="color: #000000;">0.0</span> warn : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: smallest resolution is <span style="color: #000000;">4096</span> <span style="color: #000000;">4096</span>, expected <span style="color: #000000;">1</span> <span style="color: #000000;">1</span>
MAIN <span style="color: #000000;">0.0</span> warn : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: unexpected resolutions may cause nonoptimal filtering</pre>
<p>Veillez à ce que la dernière image donné dans votre liste soit une image de 1x1 pixels. Il faut donner toute les résolutions en puissance de deux entre votre résolution max jusqu'à 1 pixel.</p>
<pre class="bash bash">D:\3D\debugMap<span style="color: #000000; font-weight: bold;">></span><span style="color: #ff0000;">"C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe"</span> <span style="color: #660033;">-v</span> <span style="color: #660033;">-r</span> <span style="color: #660033;">-c</span> test.0.png test.1.png test.2.png test.3.png test.4.png test.5.png test.6.png test.7.png test.8.png test.9.png test.10.png test.11.png test.12.png test.13.png myTexture.map
MAIN .0 info : Copyright <span style="color: #000000;">1993</span>-<span style="color: #000000;">2009</span> mental images GmbH, Berlin, Germany. All rights reserved.
MAIN .0 info : imf_copy version 3.6.1
MAIN .0 info : version 3.7.52.14, Jan <span style="color: #000000;">6</span> <span style="color: #000000;">2009</span>, revision <span style="color: #000000;">30162</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.0.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#0: test.0.png (8192 x 8192) --> myTexture.map</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.1.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#1: test.1.png (4096 x 4096) --> myTexture.map</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.2.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#2: test.2.png (2048 x 2048) --> myTexture.map</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.3.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#3: test.3.png (1024 x 1024) --> myTexture.map</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.4.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#4: test.4.png (512 x 512) --> myTexture.map</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.5.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#5: test.5.png (256 x 256) --> myTexture.map</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.6.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#6: test.6.png (128 x 128) --> myTexture.map</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.7.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#7: test.7.png (64 x 64) --> myTexture.map</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.8.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#8: test.8.png (32 x 32) --> myTexture.map</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.9.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#9: test.9.png (16 x 16) --> myTexture.map</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.10.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#10: test.10.png (8 x 8) --> myTexture.map</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.11.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#11: test.11.png (4 x 4) --> myTexture.map</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.12.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#12: test.12.png (2 x 2) --> myTexture.map</span>
IMG <span style="color: #000000;">0.0</span> info : opening <span style="color: #ff0000;">"test.13.png"</span> <span style="color: #000000; font-weight: bold;">for</span> reading
MAIN <span style="color: #000000;">0.0</span> info : C:\Program Files\Autodesk\Maya2010\bin\imf_copy.exe: <span style="color: #666666; font-style: italic;">#13: test.13.png (1 x 1) --> myTexture.map</span></pre>
<p>Vous devriez vous retrouver avec un fichier assez gros (341 Mo pour moi) que vous pouvez maintenant utiliser dans vos scènes pour débugger vos textures.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2010_creer_map_debug/map_mental_ray_create002.png" alt="map_mental_ray_create002.png" style="display:block; margin:0 auto;" title="map_mental_ray_create002.png, janv. 2010" height="320" width="146" /></p>
<p>Notez que si l'application principalement utilisé ici est Maya, normalement, ont peut très bien utiliser cette map avec n'importe quel soft qui utilise mental ray.</p>
<p>En espérant que ce billet vous aura aider. :sourit:</p>
<p>N'hésitez pas à laisser un commentaire si vous avez des questions ou si je n'ai pas été assez clair quelque part.</p>
<p>A bientôt!</p>
<center>:marioCours:</center>
Appliquer un script à toutes les scenes Maya du dossierurn:md5:c316289bd40a97c6e54a594daa9504c22009-05-29T22:20:00+02:002013-07-26T22:40:20+02:00NarannScript et codebatbatchbidouilledossiersfichiersfrmayamelpatchscript<p><img src="https://www.fevrierdorian.com/blog/public/billets/patchFolderScene/patchFolderScene003.png" alt="patchFolderScene003.png" style="float:left; margin: 0 1em 1em 0;" title="patchFolderScene003.png, mai 2009" height="90" width="90" />Il peut arriver en cours de prod d'avoir à appliquer un petite modification sur un grand nombre de scène (en général quand on en arrive là c'est qu'on a des failles dans les rouages quelque part :siffle: ). Je vous propose donc ici un méthode (il y en à d'autres) qui se révèle assez simple pour appliquer un script à l'intégralité des scènes d'un dossier.</p> <h5>Le principe</h5>
<p>Comme vous le savez surement déjà, vous pouvez lancez maya en ligne de commande. Pour plus d'information, <a href="http://fr.wikipedia.org/wiki/RTFM" hreflang="fr">RTFM</a>! Allez dans l'aide Maya:</p>
<blockquote><p>User Guide > General > Basics > Interface overview > Work with menu items, tools, and options > Start Maya from the command line</p></blockquote>
<p>Nous allons donc créer un batch qui lance Maya et exécute un script.</p>
<p>Nous auront besoin de trois choses choses:</p>
<ol>
<li>Un premier .bat: Qui contiendra les commandes maya que Windows exécute.</li>
<li>Un .mel: Qui sera le script exécuté par Maya à l'ouverture.</li>
<li>Un second .bat: Qui appellera le premier bat une fois pour chaque fichier du dossier.</li>
</ol>
<p>On pourrait s'y prendre avec un seul .bat mais ça complexifie un peu l'écriture.</p>
<h5>On approfondi</h5>
<p>La ligne de commande du premier bat ressemble grosso modo à ça (patchFolderScenes.bat):</p>
<pre class="dos dos">maya -batch -script <monSuperScript.mel> -file <maSceneMaya.ma></pre>
<p>Le script (monSuperScript.mel):</p>
<pre class="mel mel">proc monSuperScript<span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #666666; font-style: italic;">//declaration de la procedure</span>
<span style="color: #009900;">{</span>
print<span style="color: #009900;">(</span><span style="color: #ff0000;">"patchFolderScenes -> Launched...<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//on affiche le message de demarrage (facultatif)</span>
<span style="color: #666666; font-style: italic;">//mes commandes mel</span>
file <span style="color: #339933;">-</span>save<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//on sauvegarde à la fin sinon les modifications ne seront pas apporté à la scene</span>
print<span style="color: #009900;">(</span><span style="color: #ff0000;">"patchFolderScenes -> Finished...<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//on affiche le message de fin (facultatif)</span>
<span style="color: #009900;">}</span>
monSuperScript<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//on lance la procedure</span></pre>
<p>Et pour finir, le second bat qui lancera le premier pour chaque scène maya du dossier en cours (applyPatchToAllScenes.bat):</p>
<pre class="dos dos"><span style="color: #00b100; font-weight: bold;">for</span> <tout les fichier .ma ou .mb> <span style="color: #00b100; font-weight: bold;">do</span> <span style="color: #00b100; font-weight: bold;">call</span> patchFolderScenes.bat <nom du fichier></pre>
<p>C'est celui là qu'on lancera.</p>
<h5>Du concret</h5>
<p>Bon, maintenant que vous connaissez le principe, nous allons appliquer tout ça.</p>
<p>Je vous propose de créer un fichier test.bat et de l'ouvrir avec un éditeur de texte.
<img src="https://www.fevrierdorian.com/blog/public/billets/patchFolderScene/patchFolderScene001.png" alt="patchFolderScene001.png" style="display:block; margin:0 auto;" title="patchFolderScene001.png, mai 2009" height="107" width="177" />
Il existe des "trucs" (désolé, j'ai pas trouvé d'autres noms) pour afficher les répertoires. Je m'explique:</p>
<p>En batch, les fichiers argument sont des variables écrites comme ça:</p>
<pre>%1 << Premier argument du bat
%2 << Second argument du bat
etc...</pre>
<p>Taper dans votre test.bat:</p>
<pre class="dos dos"><span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">1</span>
<span style="color: #b1b100; font-weight: bold;">pause</span></pre>
<ol>
<li>Ouvrez un invite de commande Windows</li>
<li>Cliquez-glissez votre test.bat</li>
<li>Mettez un espace</li>
<li>Glissez un fichier quelconque derrière</li>
<li>Lancez tous ça!</li>
</ol>
<pre class="dos dos">C:\Documents and Settings\user\testFolder>test.bat monfichier.txt
C:\Documents and Settings\user\testFolder>echo monfichier.txt
monfichier.txt
C:\Documents and Settings\user\testFolder>pause
Appuyez sur une touche pour continuer...</pre>
<p>Maintenant, mettez:</p>
<pre class="dos dos"><span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">0</span>
<span style="color: #b1b100; font-weight: bold;">pause</span></pre>
<p>Lancez le:</p>
<pre class="dos dos">C:\Documents and Settings\user\testFolder>test.bat
C:\Documents and Settings\user\testFolder>echo test.bat
test.bat
C:\Documents and Settings\user\testFolder>pause
Appuyez sur une touche pour continuer...</pre>
<p>Oooh... Surprise...
%0 correspondau fichier bat lui même.</p>
<h5>Ça me fait une belle jambe...</h5>
<p>Du calme, ce n'est pas tout :sourit:</p>
<p>"~" (tilde) suivi d'une lettre (cf: <a href="http://www.rdpslides.com/publiclinks/FAQ00138.htm" hreflang="en">petite documentation</a>) va nous permettre de récupérer le chemin du répertoire.</p>
<pre>%~0 -> Enlève les guillemets si il y en a.
%~f0 -> C:\Documents and Settings\user\testFolder\test.bat
%~d0 -> C:
%~p0 -> \Documents and Settings\user\testFolder\
%~n0 -> test
%~x0 -> .bat
%~s0 -> C:\DOCUME~1\user\TESTFO~1\test.bat
%~a0 -> --a------ (les attributs du fichier)
%~t0 -> 29/05/2009 22:06 (Date de la dernière modification... Pratique hein? ;) )
%~z0 -> 9 (taille en octet, pratique aussi)</pre>
<p>Vous l'aurez compris:</p>
<pre class="dos dos"><span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #33cc33;">%</span><span style="color: #448888;">~dp0</span>
<span style="color: #b1b100; font-weight: bold;">pause</span></pre>
<p>Donne:</p>
<pre class="dos dos">C:\Documents and Settings\user\testFolder>test.bat
C:\Documents and Settings\user\testFolder>echo C:\Documents and Settings\user\testFolder\
C:\Documents and Settings\user\testFolder\
C:\Documents and Settings\user\testFolder>pause
Appuyez sur une touche pour continuer...</pre>
<p>Nous avons maintenant le dossier dans lequel on exécute le bat!</p>
<p>Pour simplifier la procédure, nous allons considérer que votre .mel à exécuter se trouve dans le même répertoire que le .bat :hehe: .</p>
<p>Donc:</p>
<pre class="dos dos"><span style="color: #b1b100; font-weight: bold;">echo</span> <span style="color: #33cc33;">%</span>~dp0monSuperScript.mel
<span style="color: #b1b100; font-weight: bold;">pause</span></pre>
<p>Donne:</p>
<pre class="dos dos">C:\Documents and Settings\user\testFolder>test.bat
C:\Documents and Settings\user\testFolder>echo C:\Documents and Settings\user\testFolder\monSuperScript.mel
C:\Documents and Settings\user\testFolder\monSuperScript.mel
C:\Documents and Settings\user\testFolder>pause
Appuyez sur une touche pour continuer...</pre>
<p>On viens de récupérer le chemin du script qu'on souhaite exécuter. Nous n'avons plus qu'a stocker cette information dans une variable:</p>
<pre class="dos dos"><span style="color: #b1b100; font-weight: bold;">SET</span> scriptPath=<span style="color: #33cc33;">%</span>~dp0patchFolderScenes.mel</pre>
<p>Écrire le début de la ligne de commande avec laquelle on appel Maya:</p>
<pre class="dos dos">maya -batch -script "<span style="color: #33cc33;">%</span><span style="color: #448888;">scriptPath</span><span style="color: #33cc33;">%</span>"</pre>
<p>Ajouter l'argument "file" pour dire quel fichier il doit ouvrir</p>
<pre class="dos dos">maya -batch -script "<span style="color: #33cc33;">%</span><span style="color: #448888;">scriptPath</span><span style="color: #33cc33;">%</span>" -file <span style="color: #33cc33;">%</span><span style="color: #448888;">1</span></pre>
<p>Rappelez vous, %1 est le premier argument donné après le bat.</p>
<p>Votre test.bat:</p>
<pre class="dos dos"><span style="color: #b1b100; font-weight: bold;">SET</span> scriptPath=<span style="color: #33cc33;">%</span>~dp0patchFolderScenes.mel
maya -batch -script "<span style="color: #33cc33;">%</span><span style="color: #448888;">scriptPath</span><span style="color: #33cc33;">%</span>" -file <span style="color: #33cc33;">%</span><span style="color: #448888;">1</span></pre>
<p>Si vous lancez:</p>
<pre class="dos dos">C:\Documents and Settings\user\testFolder>test.bat maScene.ma</pre>
<p>Vous aurez Maya qui ouvrira votre scène, lancera le script et quittera. Aussi simple que ça! Vous pouvez aussi cliquer glissez votre scène sur le .bat:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/patchFolderScene/patchFolderScene002.png" alt="patchFolderScene002.png" style="display:block; margin:0 auto;" title="patchFolderScene002.png, mai 2009" height="85" width="207" /></p>
<p>Renommez votre "test.bat" en "patchFolderScenes.bat".</p>
<p>Nous avons fait la moitié! Prochaine étape, faire un .bat qui appel patchFolderScenes.bat pour chaque fichier .ma ou .mb du fichier.</p>
<h5>Patch mes scènes j'te dis!</h5>
<p>Créez (toujours dans le même répertoire) un fichier "allPatchFolderScenes.bat" et ouvrez le avec un éditeur de texte.</p>
<p>Et là, attention, c'est du gros!</p>
<p>Dans un premier temps, nous allons apprendre à appeler un .bat depuis un autre .bat :hehe: . Pour cela, nous allons utiliser la commande "call" (sans déconner...). Créez un fichier "allPatchFolderScenes.bat" et entrez y:</p>
<pre class="dos dos"><span style="color: #00b100; font-weight: bold;">call</span> patchFolderScenes.bat maScene.ma</pre>
<p>Et double cliquez dessus. C'est comme si vous aviez lancez:</p>
<pre class="dos dos">C:\Documents and Settings\user\testFolder>patchFolderScenes.bat maScene.ma</pre>
<p>Maintenant, il faut intégrer ça à une boucle de batch.</p>
<h5>La boucle</h5>
<p>La boucle for en batch se fait sur une ligne...:baffed: La notre prendra la forme:</p>
<pre class="dos dos"><span style="color: #00b100; font-weight: bold;">for</span> <span style="color: #33cc33;">%%</span><span style="color: #448888;">f</span> <span style="color: #00b100; font-weight: bold;">in</span> <span style="color: #66cc66;">(</span>*.mb *.ma<span style="color: #66cc66;">)</span> <span style="color: #00b100; font-weight: bold;">do</span> <span style="color: #66cc66;">[</span>...pleins de choses...<span style="color: #66cc66;">]</span></pre>
<p>Cette boucle va récupérer tout les fichiers (sous la variable %%f) et faire: [...pleins de choses...] (En l'occurrence, vous l'aurez compris, un "call patchFolderScenes.bat maScene.ma")</p>
<p>Si vous êtes du genre pressez et que vous tapez:</p>
<pre class="dos dos"><span style="color: #00b100; font-weight: bold;">for</span> <span style="color: #33cc33;">%%</span><span style="color: #448888;">f</span> <span style="color: #00b100; font-weight: bold;">in</span> <span style="color: #66cc66;">(</span>*.mb *.ma<span style="color: #66cc66;">)</span> <span style="color: #00b100; font-weight: bold;">do</span> <span style="color: #00b100; font-weight: bold;">call</span> patchFolderScenes.bat <span style="color: #33cc33;">%%</span><span style="color: #448888;">f</span></pre>
<p>Vous aurez quelques soucis... En effet %%f est juste un nom de fichier. Et il lui faut un chemin complet vers un fichier.</p>
<p>Ni une, ni deux, je vous donne la méthode sans explications (La vérité c'est que je ne me souvient plus moi même comment je l'ai trouvé! :siffle: )</p>
<pre class="dos dos"><span style="color: #00b100; font-weight: bold;">for</span> <span style="color: #33cc33;">%%</span><span style="color: #448888;">f</span> <span style="color: #00b100; font-weight: bold;">in</span> <span style="color: #66cc66;">(</span>*.mb *.ma<span style="color: #66cc66;">)</span> <span style="color: #00b100; font-weight: bold;">do</span> <span style="color: #00b100; font-weight: bold;">call</span> patchFolderScenes.bat <span style="color: #33cc33;">%</span><span style="color: #33cc33;">%</span>~dpf<span style="color: #33cc33;">%%</span><span style="color: #448888;">f</span></pre>
<p>Vous n'avez plus qu'a double-cliquer sur "allPatchFolderScenes.bat" et il appellera, pour chaque fichier .ma ou .mb du dossier, "patchFolderScenes.bat" avec comme argument, le chemin de la scène.</p>
<p>Vous pouvez vous redresser et admirer votre ordinateur s'épuiser à ouvrir les 300 plans pour changer la couleur du poil de cul d'un des objet de vos scènes (que vous vous maudissez de ne pas avoir importé en référence externe pour le coup) parce que la femme de votre client à trouvé que c'était "mieux en rose bonbon sur font vert-fuschia"...</p>
<p>Bref, vous y trouverez surement un intérêt! En cas de problème n'hésitez pas à laisser un commentaire, j'ai testé la manipulation mais il se peut que j'ai oublié deux trois détails.</p>
<p>A bientôt!</p>
<p>Dorian</p>