Catégorie : Graphisme     Tags :      0 Commentaire

      Retrouvez cet article dans : Linux Magazine 91

    L’effet de flou focal est omniprésent dans les médias audiovisuels. Il permet de mettre en évidence des sujets importants dans les scènes, qu’elles soient photographiques ou cinématographiques, ou simplement dans un but artistique.

    Vous ne savez pas ce qu’est le flou focal ? Vous avez certainement vu des scènes au cinéma ou à la télévision où un personnage du premier plan discute avec un autre personnage en arrière-plan. Celui qui parle est parfaitement discerné par les spectateurs, tandis que l’auditeur en retrait baigne dans le flou, et réciproquement lorsque celui qui a la parole change. C’est tout simplement de cela qu’il s’agit : donner à l’image une importance particulière à un objet ou une personne, au détriment du reste de la scène qui devient flou. De même, lorsque vous prenez des photographies de trop près, votre sujet sera certainement flou, sauf si vous disposez d’un autofocus ou d’un mode macro, ou que vous soyez suffisamment averti pour régler la focale de votre appareil sans l’aide de l’électronique (la plupart des appareils photo numériques modernes disposent en effet d’un autofocus).

    /img-articles/lm/91/art-3/fig-1.jpg

    Figure 01: Exemple de flou focal sur une scène très primitive

    Dans leur quête de photoréalisme, les moteurs de rendu s’exercent tous plus ou moins à cet art difficile qu’est la simulation de l’effet de flou focal. On parle indifféremment de flou focal (focal blur) ou de champ de profondeur (depth of field). Dans sa première partie, cet article va explorer deux méthodes très classiques de simulation de cet effet, puis, dans sa seconde partie, il s’attachera à expliquer comment le mettre en œuvre avec Yafray.

    Notions fondamentales (et rapprochement avec le jargon de nos amis photographes) :

    Le point focal : c’est le point virtuel de l’espace sur lequel la caméra est pointée. Activement observé, il sera parfaitement net, du point de vue de la caméra. En photographie, on parle souvent de distance de mise au point (à partir de la caméra et dans la direction d’observation de celle-ci).
    L’ouverture : terme directement emprunté au monde des photographes, l’ouverture (du diaphragme) permet de quantifier le niveau de flou d’une image. Plus le diaphragme est ouvert, plus l’image résultante sera floue. A contrario, plus il est fermé, plus l’image sera nette.
    Le champ de profondeur : encore un terme directement emprunté au monde de la photographie, et qui découle directement des deux notions présentées ci-avant. Chez nos amis photographes, la profondeur de champ définit la zone de l’espace dans laquelle doit se trouver le sujet à capturer pour que l’on puisse en obtenir une image considérée comme nette. Dans notre monde virtuel, c’est l’ouverture qui définit l’espace net encadrant le point focal dans la direction d’observation.

    1. Le flou focal : les méthodes

    Il existe en particulier deux méthodes très conventionnelles pour simuler un flou focal, directement en cours de rendu. Il existe d’autres méthodes que celles présentées ici, en particulier, l’usage d’un logiciel de retouche d’image comme The Gimp, où il s’agit, par le biais de l’usage de calques ou de sélections, de n’appliquer un flou gaussien que sur une partie de l’image.
    Tout au long de cet article, nous allons travailler sur la base de la scène d’exemple qui suit, créée et rendue dans Blender. Elle nous servira également à montrer les différences entre les deux méthodes conventionnelles de flou focal. On y parlera de point focal, qui spécifie le point virtuel qui sera toujours parfaitement net sur l’image rendue. Habituellement, il est défini par une distance spécifique depuis la caméra, et dans la direction visée par celle-ci, mais cela peut varier d’un logiciel à l’autre, ou d’un moteur de rendu à l’autre.

    /img-articles/lm/91/art-3/fig-2.jpg

    Figure 02 : Matérialisation du point focal dans Blender : une croix jaune sur la ligne de visée de la caméra indique sans ambiguïté la distance à laquelle le rendu sera parfaitement net

    /img-articles/lm/91/art-3/fig-3.jpg

    Figure 03 : La scène de base dans Blender (rendu effectué avec option de Radiosité)

     

    1.1 Méthode 2D : usage du Zbuffer

    Dans le cadre de cette première méthode, nous allons attribuer à chaque pixel de l’image une couleur qui ne sera pas propre à la couleur de l’objet rendu, mais un dégradé de gris, fonction de la distance qui sépare le pixel par rapport au point focal théorique. Par exemple, les pixels situés à la même distance que le point focal seront d’un noir parfait, et les points les plus éloignés totalement blancs. On appelle cela le tampon de profondeur Z, ou encore le Zbuffer.

     

    /img-articles/lm/91/art-3/fig-4.jpg

    Figure 04 : Exemple du contenu d’un Zbuffer

    L’usage de cette carte de profondeur est alors assez simple : on considère que les points totalement noirs sont totalement nets, et que les points totalement blancs sont totalement flous (intensité de flou maximale). Les points intermédiaires sont plus (clairs) ou moins (sombres) flous en fonction de leur position sur le dégradé de gris. Un simple filtre 2D permet alors de " flouter " chaque point en fonction de sa distance par rapport au point focal.

    Un exemple d’application de cette méthode est celle du moteur de rendu interne de Blender. Grâce aux nœuds composites introduits dans Blender 2.42, il est possible de définir un dégradé de gris personnalisé qui permet de tenir compte de la position d’un point focal qui n’est autrement pas défini, grâce aux nœuds Map Values (paramètre Offset). Une fois la carte de floutage obtenue par superposition (méthode Overlay du nœud Mix) du dégradé devant le point focal et celui derrière le point focal, un nœud Blur permet de flouter l’image d’origine en fonction de l’intensité des gris ; le nombre d’échantillons utilisés lors de l’opération sont définis par les paramètres X et Y du nœud Blur, ainsi que l’algorithme de flou (CatRom, dans le même nœud).

     

    /img-articles/lm/91/art-3/fig-5.jpg

     Figure 05 : Exemple d’un réseau nodal permettant de simuler un effet de flou focal dans Blender, avec son moteur de rendu interne

    Le résultat est plus ou moins convaincant, suivant l’importance attachée par l’exploration de l’utilisateur des paramètres Offset et Size du nœud Map Values, ainsi que des algorithmes, l’usage de bokehs ou encore le nombre d’échantillons de flou dans le nœud Blur.

     

    /img-articles/lm/91/art-3/fig-6.jpg

    Figure 06 : Exemple de flou focal grâce aux nœuds Composite de Blender

    Cette méthode présente quelques avantages certains sur la version raytracée du flou focal : s’agissant d’un post-traitement 2D à une image rendue, l’image finale est très rapide à calculer, et s’en trouve particulièrement utile dans le cadre du rendu d’animations. Le réseau nodal, en revanche, demande un minimum d’expertise de la part de l’utilisateur (même s’il n’y a rien de très compliqué en soi) et surtout qu’un certain temps soit passé par l’utilisateur en recherche des réglages optimaux. Seul bémol : le flou focal obtenu n’est en rien réaliste, et répond à des critères artistiques correspondant à l’idée subjective que l’utilisateur se fait d’un bon effet de flou focal.

    1.2 Méthode 3D : le raytracing

    Dans cette méthode, nous en reviendrons à la définition du raytracing pour comprendre comment le flou focal est simulé. En temps normal, pour chaque pixel de l’image rendue, un rayon est lancé depuis la caméra, et, s’il rencontre un objet (disons de couleur rouge), le moteur de rendu affiche un point rouge sur l’image finale. Lorsque l’on cherche à simuler un effet de flou focal en raytracing, on commence par définir l’ouverture de la caméra ; plus celle-ci sera faible, moins il y aura de flou. Au contraire, plus l’ouverture sera élevée, plus l’image pourra être floue. Le principe va donc consister à définir, pour chaque pixel, un cône (dont l’origine coïncide avec celle de la caméra) et dont l’angle d’ouverture est lié à la valeur d’ouverture spécifiée à la caméra. Au lieu de lancer un rayon unique depuis la caméra jusqu’au pixel visé, le moteur de rendu lancera un certain nombre de rayons, aléatoirement, mais tous situés à l’intérieur du cône. La couleur de chacun des rayons sera moyennée et le résultat affiché sur l’image finale. Il en résulte une propriété intéressante : à valeur d’ouverture égale, plus vous lancerez de rayons, plus vous obtiendrez un flou progressif. Si vous voyez apparaître un phénomène de grain, c’est certainement dû au fait que le moteur de rendu ne lance pas un nombre suffisant de rayons.

     

    /img-articles/lm/91/art-3/fig-7.jpg

    Figure 07 : Exemple d’un rendu de flou focal par Raytracing avec Yafray (rendu effectué avec option d’illumination globale par la méthode de Monte-Carlo)

    L’avantage de cette méthode est qu’elle est extrêmement simple à mettre en œuvre : vous devez définir la distance focale, l’ouverture de la caméra, et, enfin, décider du nombre de rayons à lancer pour obtenir un résultat le moins " granuleux " possible. En revanche, l’inconvénient principal est de taille : pour définir la couleur d’un pixel, vous lancez un nombre considérable de rayons ; et, au plus, vous souhaiterez atténuer le phénomène de granularité affectant vos images, au plus vous augmenterez le nombre de rayons et, par conséquent, les temps de rendu. Si ce compromis peut être satisfaisant dans le cadre du rendu d’une image fixe, il devient un certain handicap dans le cadre du rendu d’une animation.

    2. Le flou focal avec Yafray

    Le paramétrage de l’effet de flou focal va se réaliser dans le bloc <camera> du fichier .xml de votre scène, tandis que la qualité de l’effet de flou sera déterminée par les paramètres d’anti-crénelage (anti-aliasing) relatifs au bloc <render>. Les codes que nous allons tester sont les suivants, mais seules les parties mises en évidence vont faire l’objet de nos expérimentations.

     

    <camera name="MAINCAM" type="perspective" resx="400" resy="300"
      focal="1.093750" aspect_ratio="1.000000"
      dof_distance="7.500000" aperture="0.200000" 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="8" AA_minsamples="64"
                 AA_pixelwidth="1.500000" AA_threshold="0.050000"
                 background_name="world_background" >
                 <outfile value="/tmp/YBtest.tga" />
    </render>

    2.1 dof_distance

    Ce paramètre permet de définir le point focal, c’est-à-dire le point virtuel de l’espace sur lequel la caméra est concentrée. Ce point sera affiché avec une netteté totale. Les surfaces situées en amont ou en aval du point focal sur la ligne de vue de la caméra deviennent progressivement plus floues à mesure qu’elles s’éloignent du point focal. Par exemple, sur la figure 08, avec une valeur dof_distance égale à 8.5 (image de gauche), la boule rouge est pratiquement nette, car très proche du point focal, et, à mesure que l’on s’éloigne vers l’arrière-plan, les autres objets qui constituent le décor sont de plus en plus flous.

     

    /img-articles/lm/91/art-3/fig-8.jpg

    Figure 08 : dof_distance = 8.5 (image de gauche) et dof_distance = 12.5 (image de droite) ; l’influence de ce paramètre sur le flou focal est sans équivoque.

    Sur l’image de droite, la valeur dof_distance a été passée à 12.5, ce qui veut dire que le point focal a été éloigné vers le fond de la scène. En conséquence, les parallélépipèdes vert et jaune sont pratiquement nets, tandis que celui bleu ciel est légèrement flou. La boule rouge, au premier plan et la plus éloignée du point focal, est le volume le plus flou observé.

    2.2 Aperture

    Il s’agit là de l’ouverture de la lentille virtuelle de la caméra. Des valeurs élevées vont générer un flou  important, et une valeur nulle, l’absence totale de profondeur de champ. Sur les images qui suivent, les valeurs d’aperture sont respectivement égales à 0.1, 0.2, 0.5 et 1.0. L’évolution du champ de profondeur est sans appel : il s’amenuise à mesure que l’ouverture augmente.

     

     

    /img-articles/lm/91/art-3/fig-9.jpg

    Figure 09 : À point focal strictement identique, la valeur d’ouverture de la caméra modifie drastiquement l’apparence de la scène.

     

     

    2.3 use_qmc

    Ce paramètre n’a qu’un usage assez limité. En l’activant (use_qmc="on"), la caméra utilisera un échantillonnage de Monte-Carlo, qui fera converger les calculs un petit peu plus vite, mais un grand nombre d’échantillons demeurera nécessaire pour avoir un flou de qualité correcte, surtout en cas d’usage des bokehs. Dans son état actuel, son intérêt est très limité, mais son usage n’induit pas de contrepartie. Vous pouvez donc l’activer à chaque fois que vous souhaiterez faire un rendu avec du flou focal. Si vous ne l’utilisez pas, un échantillonnage purement aléatoire sera utilisé lors de la phase de lancer de rayons.

     

    3. Les bokehs

    Il est assez difficile de trouver une " bonne " définition du bokeh. Disons qu’il s’agit d’un mot japonais et qu’il définit, aujourd’hui, chez nos amis photographes, l’aspect des zones floues à l’arrière-plan de leurs sujets. Le choix de la forme d’un bokeh ne devant répondre primairement qu’à des considérations esthétiques, le mieux est de tenter de les illustrer plutôt que d’en parler trop longuement. Yafray propose différents types de bokehs : disk1, disk2, triangle, square, pentagon, hexagon, ring. Il est assez difficile de faire la différence à l’œil nu, mais disons que le bokeh définit la " forme " d’un point hors du champ de profondeur de la caméra. Pour définir une forme de bokeh particulière, il faut recourir à l’argument suivant :

     

     bokeh_type="[forme]"

    où vous remplacerez [forme] par le bokeh de votre choix, par exemple hexagon.

    La plupart (tous à l’exception de Disk1 et Ring) admettent des paramètres supplémentaires, qui permettent d’ajuster la forme du bokeh, grâce au paramètre bokeh_bias="[type]", où [type] peut être uniform, center ou edge.
    À l’exception de disk1 et ring, tous les autres bokehs peuvent se voir donné une orientation particulière grâce à l’argument bokeh_rotation="[valeur]", où [valeur] est tout simplement une valeur angulaire.
    J’ai renoncé à préparer des exemples de rendu mettant en œuvre ces différents types de bokehs, car il est difficile de les discerner à l’œil nu, et cette difficulté serait amplifiée par l’impression sur papier. Sur un même rendu, en utilisant un bokeh de type disk1 et un autre de type ring, il est possible de noter une différence significative, mais c’est bien plus délicat avec les autres bokehs.

     

     

    /img-articles/lm/91/art-3/fig-10.jpg

     Figure 10 : Exemple d’usage d’un bokeh de type disk1 et un autre de type ring

    4. L’anti-crénelage

    En lançant un rayon unique par pixel de votre image, plus la résolution de celle-ci sera faible, plus vous obtiendrez des formes aux contours hachés, trop nets et par conséquent fort peu réalistes. La technique d’anti-crénelage consiste à lancer, pour un même pixel, un plus grand nombre de rayons avec de très faibles déviations d’angle, afin " d’échantillonner " les pixels voisins et afficher, pour le pixel courant, la couleur qui le " fond " le mieux dans son environnement. Il en résulte alors des bords plus lisses, plus réalistes, à mesure que le taux d’échantillonnage augmente.

     

     

    /img-articles/lm/91/art-3/fig-11.jpg

    Figure 11 : Exemples de rendus sans anti-crénelage (image de gauche) et avec (image de droite) : les bords des objets de l’image de gauche sont précis au pixel près, et sont hachés ; sur l’image de droite, chaque pixel rendu tient compte des pixels voisins et s’harmonise plus facilement.

    Yafray établit son échantillonnage en plusieurs passes, et pour chaque passe, utilise un certain nombre d’échantillons. Comme nous venons de le voir, plus le nombre d’échantillons sera élevé, plus le résultat sera lisse à l’œil nu, et cela, même avec une seule passe. Nous pouvons le voir sur la figure suivante, qui présente des rendus avec respectivement 0 échantillons, 2 échantillons, 8 échantillons et 32 échantillons. On voit facilement que les résultats deviennent acceptables à partir d’environ 8 échantillons, et que le résultat semble parfait aux alentours de 32 échantillons. Il n’est donc pas utile, pour un rendu classique, d’augmenter le nombre d’échantillons au-delà d’un certain niveau.

     

     

    /img-articles/lm/91/art-3/fig-12.jpg

    Figure 12 : Le nombre d’échantillons joue sur la fidélité de rendu des silhouettes des objets, surtout lorsqu’ils présentent des arêtes vives.

    En revanche, le nombre d’échantillon par passe revêt une importance particulière lors du rendu d’une image avec un flou focal, car c’est lui qui va, principalement, atténuer la granularité de l’image. Rappelez-vous : pour déterminer la couleur d’un pixel flou, le moteur de rendu va lancer un certain nombre de rayons à l’intérieur d’un cône pointant depuis la caméra vers un pixel de l’image. Plus vous augmentez l’échantillon, plus le nombre de rayons lancés lors de cette phase sera important, et plus le pixel prendra une couleur " neutre " ou " floue " par rapport à son environnement.

     

     

    /img-articles/lm/91/art-3/fig-13.jpg

    Figure 13 : L’influence du nombre d’échantillons sur la qualité du flou focal est mis en évidence sur cette succession d’images.

    Maintenant, en considérant que Yafray peut répéter l’opération d’anti-crénelage plusieurs fois (chaque opération est alors considérée comme une passe distincte) et d’en moyenner les résultats, on en déduit qu’augmenter le nombre de passes va également tendre à améliorer le lissage des zones floues, comme le montre l’illustration suivante. Chacune des deux images a été réalisée avec 32 échantillons par passe, mais l’image de gauche n’utilise qu’une seule passe, tandis que celle de droite en utilise quatre.

     

     

    /img-articles/lm/91/art-3/fig-14.jpg

     Figure 14 : Le nombre de passes d’anti-crénelage joue également son rôle dans la qualité du flou mis en place.

    Toute la subtilité de ces réglages consiste donc à trouver le compromis entre le nombre de passes et le nombre d’échantillons par passe pour préserver des temps de calculs raisonnables tout en atteignant des résultats visuellement attractifs. Bien sûr, tout dépendra du niveau de flou (et donc du paramètre aperture) dans votre scène, mais vous pouvez considérer qu’avec un nombre de passes aux alentours de 4 à 8, avec et un nombre d’échantillons par passe variant de 16 à 64, vous devriez obtenir des résultats satisfaisants.
    Dans le fichier .xml de Yafray, vous spécifierez le nombre de passes [valeur1] à réaliser grâce au paramètre AA_passes="[valeur1]". Pour sa part, le nombre d’échantillons par passe [valeur2] sera défini par le paramètre AA_minsamples="[valeur2]".

    Conclusion

    Nous en arrivons pratiquement à la fin de cette mini-série consacrée à Yafray, et nous commençons maintenant à maîtriser les différentes spécificités de ce moteur qui lui permettent de prétendre à figurer dans la catégorie des moteurs de rendu photoréalistes. Si le flou focal est un phénomène très commun dans notre monde où l’industrie visuelle est très porteuse, nous venons de voir qu’il n’était pas si difficile d’en comprendre les mécanismes pour les reproduire dans notre univers virtuel fait en images de synthèse.

    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]

      Retrouvez cet article dans : Linux Magazine 91

    Posté par Olivier Saraja (olivS) | Signature : Olivier Saraja | Article paru dans

    Laissez une réponse

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