Retrouvez cet article dans : Linux Magazine 89
Yafray est un moteur de rendu libre dont l’objectif est le photoréalisme. Bien que somme toute classique dans ses fonctionnalités, bien utilisé, il s’avère rapide et puissant, capable de résultats de très bonne tenue. Il en devient le compagnon de route de divers modeleurs, à l’image de Wings3D ou Blender lui-même.
A l’instar de Povray, Yafray repose sur un langage de description de scène (Scene Description Language ou SDL) pour l’instruire de ce qu’il faut rendre. Le fichier de description de scène est tout simplement un fichier XML formaté de façon spécifique. L’objectif de cette mini-série d’articles sur Yafray est d’apprendre à maîtriser son langage de description et l’utiliser de façon pertinente, en approfondissant notre connaissance de ses paramètres et rouages internes.

Yafray : le lancer de rayon pour les masses
1. Compilation et installation de Yafray
L’installation de Yafray devrait être triviale si vous utilisez les paquets pré-compilés proposés sur la page Downloads du projet (http://www.yafray.org/index.php?s=2). Malheureusement, ils ne fonctionnent pas à tous les coups ; par exemple, les paquets pré-compilés pour Debian Etch ne fonctionnent pas sur une Ubuntu. De plus, en tant que moteur de rendu, pour bénéficier des temps de calcul les plus courts possibles, optimiser le moteur de rendu en fonction de votre classe de processeur est une bonne idée. Compiler et installer soi-même Yafray est donc fortement conseillé, et ne devrait pas poser de souci majeur au lecteur " moyen " de GNU/Linux Magazine.1.1 Outils et dépendances
Yafray est soumis à plusieurs dépendances qui nécessiteront donc l’installation de bibliothèques et outils variés pour permettre sa compilation. Les outils nécessaires comprennent bien évidemment le compilateur c++1.2 Compilation
Vous téléchargerez les sources de Yafray sur la page Downloads déjà citée du projet. Après avoir décompacté l’archive .tar.gz sur votre disque, vous vous rendrez dans le répertoire
$ scons arch=pour lancer la compilation. Bien sûr, vous adapterez la valeur deathlon-xp
1.3 Installation des fichiers
Pour l’étape suivante, vous aurez besoin des privilèges du super-utilisateur. Il vous faudra utiliser la commande suivante :$ scons arch=Pensez à bien spécifier la même architecture que précédemment,athlon-xpinstall
2. Usage de Yafray à partir de Blender (et création de votre premier fichier XML)
Ce n’est pas l’objet de ces articles, mais quelques mots sur l’usage conjoint de Blender et Yafray peuvent vous aider dans votre apprentissage de ce dernier. Ouvrez une session de Blender. Allez dans le menu Scene (touche [F10]) et dans le panneau Render, sélectionnez YafRay à la place de Blender Internal. Deux nouveaux onglets se greffent au panneau Render.
Les principaux onglets relatifs au rendu avec Yafray depuis Blender
Jetez immédiatement un œil à l’onglet YafRay, et vérifiez que le bouton xml est activé. C’est grâce à lui qu’au moment du rendu seront créés les fichiers vous permettant de paramétrer finement Yafray. Faîtes le test avec la scène par défaut de Blender, en retournant dans l’onglet Render et en cliquant sur le bouton éponyme. La console de Blender nous renseigne sur les actions alors entreprises :
Starting scene conversion. Scene conversion done. No export directory set in user defaults! Will try TEMP instead: /tmp Yafray found at : /usr/local/bin/ COMMAND: /usr/local/bin/yafray -c 2 "/tmp/YBtest.xml" Starting YafRay ... Loading grammar ... Starting parser ... Parsing OK Loading plugins from ‘/usr/local/lib/yafray’... Registered arealight Registered basicblocks Registered basicshaders Registered blendershaders Registered globalphotonlight Registered HDRI background Registered hemilight Registered mix block Registered pathlight Registered photonlight Registered pointlight Registered Shader Background Registered softlight Registered spherelight Registered spotlight Registered sss Registered sunlight Registered sunsky found 18 plugins! [Loader]: Added shader MAMaterial starting build of kd-tree === kd-tree stats (0s) === primitives in tree: 12 interior nodes: 1 / leaf nodes: 2 (empty: 1 = 50%) [Loader]: Added object OBCube [Loader]: Added pointlight light LAMP1 [Loader]: Added constant background world_background [Loader]: Added camera MAINCAM Using a world resolution of 0.00114286 per unit Rendering with 5 raydepth 2 anti-alias passes and 4 minimum samples per pass, 8 samples total. Building bounding tree ... Object count= 1 OK Light setup ... Setting up lights ... Finished setting up lights Launching 2 threads Render pass: [#############] Saving Targa file as /tmp/YBtest.tga OK Yafray completed successfullyVous noterez en particulier que le répertoire par défaut de Yafray est

Le cube par défaut de Blender, rendu par Yafray : le début de la passion !
Ce fichier peut être ouvert et modifié à l’aide de n’importe quel éditeur de texte. Ce qui est particulièrement intéressant, c’est qu’il est parfaitement structuré, et donc relativement facile à parcourir. Nous insisterons sur le " relativement ". En effet, chaque maillage de la scène est décrit par une succession de points (décrivant les sommets du maillage) et de faces (décrivant les facettes du maillage). Pour les objets les plus simples, les fichiers3. Structure d’un fichier XML de Yafray
Si vous jetez un œil sur le fichier<scene>
<shader>
</shader>
<transform>
<object>
</object>
</transform>
<light>
</light>
<camera>
</camera>
<filter>
</filter>
<background>
</background>
<render>
</render>
</scene>
Le bloc 4. Quelques bases rapides et utiles
Plutôt que d’attaquer, bille en tête, la syntaxe particulière de Yafray, nous allons survoler quelques-uns des éléments les plus couramment utilisés. Ainsi, vous appréhenderez plus facilement les prochaines parties de cette mini-série. Pour cela, il va nous falloir un exemple concret, et quoi de mieux que le fichier XML de la scène par défaut de Blender ? Si vous avez suivi scrupuleusement les instructions de section 2 de cet article, vous devriez trouver un fichier nommé<scene>
<shader type="blendershader" name="MAMaterial" >
<attributes>
<color r="0.800000" g="0.800000" b="0.800000" />
<specular_color r="1.000000" g="1.000000" b="1.000000" />
<mirror_color r="1.000000" g="1.000000" b="1.000000" />
<diffuse_reflect value="0.800000" />
<specular_amount value="0.500000" />
<alpha value="1.000000" />
<emit value="0.000000" />
<matmodes value="traceable shadow" />
<diffuse_brdf value="lambert" />
<specular_brdf value="blender_cooktorr" />
<hard value="50" />
</attributes>
</shader>
<transform m00="1.000000" m01="0.000000" m02="0.000000" m03="0.000000"
m10="0.000000" m11="1.000000" m12="0.000000" m13="0.000000"
m20="0.000000" m21="0.000000" m22="1.000000" m23="0.000000"
m30="0.000000" m31="0.000000" m32="0.000000" m33="1.000000">
<object name="OBCube" shadow="on" shader_name="MAMaterial" >
<attributes>
</attributes>
<mesh autosmooth="0.1" has_orco="on" >
<points>
<p x=”1.000000” y=”1.000000” z=”-1.000000” />
<p x=”0.999999” y=”1.000000” z=”-1.000000” />
<p x=”1.000000” y=”-1.000000” z=”-1.000000” />
<p x=”0.999999” y=”-0.999999” z=”-1.000000” />
<p x=”-1.000000” y=”-1.000000” z=”-1.000000” />
<p x=”-1.000000” y=”-0.999999” z=”-1.000000” />
<p x=”-0.999999” y=”1.000000” z=”-1.000000” />
<p x=”-0.999999” y=”1.000000” z=”-1.000000” />
<p x=”1.000000” y=”1.000000” z=”0.999999” />
<p x=”1.000000” y=”0.999999” z=”1.000000” />
<p x=”-1.000000” y=”1.000000” z=”1.000000” />
<p x=”-1.000000” y=”1.000000” z=”1.000000” />
<p x=”-1.000000” y=”-1.000000” z=”1.000000” />
<p x=”-1.000000” y=”-0.999999” z=”1.000000” />
<p x=”0.999999” y=”-1.000000” z=”1.000000” />
<p x=”0.999999” y=”-1.000000” z=”1.000000” />
</points>
<faces>
<f a="0" b="2" c="4" shader_name="MAMaterial" />
<f a="4" b="6" c="0" shader_name="MAMaterial" />
<f a="8" b="10" c="12" shader_name="MAMaterial" />
<f a="12" b="14" c="8" shader_name="MAMaterial" />
<f a="0" b="8" c="14" shader_name="MAMaterial" />
<f a="14" b="2" c="0" shader_name="MAMaterial" />
<f a="2" b="14" c="12" shader_name="MAMaterial" />
<f a="12" b="4" c="2" shader_name="MAMaterial" />
<f a="4" b="12" c="10" shader_name="MAMaterial" />
<f a="10" b="6" c="4" shader_name="MAMaterial" />
<f a="8" b="0" c="6" shader_name="MAMaterial" />
<f a="6" b="10" c="8" shader_name="MAMaterial" />
</faces>
</mesh>
</object>
</transform>
<light type="pointlight" glow_intensity="0.000000" glow_offset="0.000000" glow_type="0" name="LAMP1" power="29.999983"
cast_shadows="on" >
<from x="4.076245" y="1.005454" z="5.903862" />
<color r="1.000000" g="1.000000" b="1.000000" />
</light>
<background type="constant" name="world_background" >
<color r="0.056563" g="0.220815" b="0.400000" />
</background>
<camera name="MAINCAM" type="perspective" resx="800" resy="600"
focal="1.093750" aspect_ratio="1.000000"
dof_distance="0.000000" aperture="0.000000" use_qmc="on"
bokeh_type="disk1" bokeh_bias="uniform" bokeh_rotation="0.000000" >
<from x="7.481132" y="-6.507640" z="5.343665" />
<to x="6.826270" y="-5.896974" z="4.898420" />
<up x="7.163761" y="-6.195171" z="6.239008" />
</camera>
<render camera_name="MAINCAM"
raydepth="5" gamma="1.000000" exposure="0.000000"
AA_passes=”2” AA_minsamples=”4”
AA_pixelwidth="1.5" AA_threshold="0.05" bias="0.001000" clamp_rgb="on"
background_name="world_background"
>
<outfile value="/tmp/YBtest.tga" />
</render>
</scene>
Un bloc donné peut contenir différents paramètres, chacun compris entre un <from x="7.481132" y="-6.507640" z="5.343665" />Le paramètre peut posséder plusieurs attributs (par exemple, ici :
<camera name="MAINCAM" type="perspective" resx="800" resy="600" />permet de définir une caméra unique, en lui donnant un nom (
4.1 Le bloc transform
Il s’agit d’une matrice 4x4 de transformation " classique ". La portion 3x3 en haut à gauche correspond à la matrice de transformation (rotation, échelle, cisaillement) et le vecteur colonne (<transform m00="En conséquence, la manipulation directe du bloc0.707107" m01="-0.707107" m02="0.000000" m03="0.000000" m10="0.707107" m11="0.707107" m12="0.000000" m13="0.000000" m20="0.000000" m21="0.000000" m22="1.000000" m23="0.000000" m30="0.000000" m31="0.000000" m32="0.000000" m33="1.000000">
4.2 Le bloc camera
La syntaxe de ce bloc s’approche plus de ce que l’on peut voir dans des langages de description de scènes comme celui de Povray. Nous noterons en particulier les paramètresfrom: dont les coordonnéesx,yetzdéfinissent le point-origine de la caméra ;to: dont les coordonnéesx,yetzdéfinissent le point visé par la caméra ;up: dont les coordonnées x, y et z définissent un point représentant le " haut " de la caméra ; la manipulation de cette coordonnée est très pratique pour faire " tourner " la caméra sur elle-même.
4.3 Le bloc render
C’est ici que la qualité d’un rendu va se jouer. Tout d’abord, au niveau de la profondeur de récursivité des rayons lancés par le moteur, au travers du paramètre4.4 L’arrière-plan
L’arrière-plan est défini par un bloc de type4.5 Le bloc light
Il existe différents types de lampes, mais les deux plus communes sont celles permettant de produire des ombres dures (4.6 Le bloc object
Yafray ne supporte que les maillages, aussi n’existe-t-il aucune primitive comme c’est par exemple le cas pour Povray. Il faudrait donc certainement être un brin masochiste pour essayer de décrire des figures complexes à partir d’un éditeur de texte directement dans le fichier XML : ce format, ainsi que le SDL de Yafray, n’ont pas été conçus pour cela. Yafray est et ne restera jamais rien d’autre qu’un moteur de rendu, un compagnon pour votre outil de modélisation préféré, quel qu’il soit. Directement dans la balise4.7 Le bloc shader
Ce bloc a une structure extrêmement simple, mais il fait partie de ceux qui sont les plus riches en paramètres et options. Outre les paramètres typiques (Conclusion
Nous n’avons bien sûr fait que survoler la syntaxe particulière de Yafray, mais nous en avons désormais une vision d’ensemble, et c’est là tout le but de cet article. Pour fonctionner, Yafray repose donc sur un SDL qui lui est propre. Mais contrairement au SDL de Povray, il n’est pas prévu pour composer des scènes entières avec seulement un éditeur de texte. Un modeleur solide, nanti de la possibilité d’exporter les objets au format XML de Yafray est donc d’une rigoureuse nécessité. L’éditeur de texte devra être robuste, également, car si l’on considère le nombre de lignes nécessaires à la description d’un simple cube, on peut imaginer le résultat sur une scène entière composée de plusieurs entités organiques ! Les fichiers XML risquent alors de prendre des proportions déraisonnables. Apprendre à naviguer dans de tels fichiers éléphantesques est alors une absolue nécessité si vous souhaitez tirer parti des capacités remarquables de Yafray, et c’est exactement ce qui a motivé l’étude du fichier XML correspondant à la (très simple !) scène par défaut de Blender : si vous avez saisi sa structure, vous serez armé pour vous attaquer à n’importe quelle scène, pratiquement quelle que soit sa taille ! A vos éditeurs de texte et à bientôt pour l’exploration des talents cachés de Yafray !!! Liens :- Le site de Yafray : www.yafray.org [en]
- Les forums consacrés à Yafray :www.yafray.org/forum/index.php [en]
- La documentation de Yafray : wiki.yafray.org/bin/view.pl/UserDoc/WebHome [en]
- La foire aux questions (FAQ) de Yafray : wiki.yafray.org/bin/view.pl/UserDoc/FaqEng [en]
- De l’aide en français ? Les forums de Linuxgraphic : www.linuxgraphic.org/forums/ [fr]
- Le site de Blender : www.blender.org [en]
- Le site de Wings3D : www.wings3d.com [en]
Retrouvez cet article dans : Linux Magazine 89





Donnez votre avis
Vous devez avoir ouvert une session pour écrire un commentaire.