Fabrice Macagno nous explique le principe de la technique de "boolean shading"
L'idée est simple: au lieu de découper physiquement des faces -via les opérations booléennes - on va, au moment du rendu, rendre transparentes les parties de l'objet censées être découpées. Les intérêts sont multiples :
• pas de temps lié à l'opération booléenne (qui peut vite devenir longue selon la complexité et le nombre d'objets)
• cohérence au cours de l'animation (les opérations booléennes peuvent générer des artéfacts liés au positionnement des uvs sur l'objet résultat)
• contrôle du shading de la surface de l'objet découpé ET de la surface d'intersection
• Le motion blur "3d" est possible car contrairement à une opération boolééne, le nombre de points qui
définissent les objets reste constant dans le temps.
On utilise 2 shaders : l'un sera assigné à l'objet découpant - ou "slicer" - et l'autre à l'objet découpé - "cutted" -.
slicer shader
Le rôle du slicer shader est de :
• déterminer si l'on se trouve à l'intérieur d'un objet découpé
• récupérer via le shader de l'objet découpé le shader à utiliser pour la surface d'intersection
• évaluer ce shader
cutted shader
Le cutted shader détermine si le pixel évalué est transparent ou non. La méthode de test
dépend de l'objet utilisé en tant que slicer.
un peu plus deep...
C'est le calcul de la visibilité qui peut devenir compliqué. Il dépend du type d'objet utilisé en tant que slicer. Des objets paramétriques tels que des plans, sphères ou cubes permettent de décider assez facilement. Pour un plan la normale est suffisante, pour une sphère on utilise le rayon. On s'est limité à ces cas simples. Pour des slicers quelconques, on pourrait utiliser leur bounding box plus quelques lancer de rayons par exemple. "Lancer de rayons" car le moteur de rendu qu'on utilise -arnold- est un pur ray tracer et c'est donc dans cette logique qu'on a abordé ces shaders. On a été aidés tout au long du projet par les développeurs d'arnold qui ont mis à notre disposition certaines fonctionnalités comme un lancer de rayon très rapide permettant de simplement tester une intersection, sans évaluation de shader. Associé aux "ray types", on peut ainsi éviter un ralentissement si le nombre d'objets à traverser devient important.