Techniques de rendu des contours dans Unity
Le dessin des contours d’un objet est utilisé pour visualiser l’état de sélection et c’est aussi la base de tout Toon Shading (Cel Shading, ombrage de celluloïd). Dans cet article, nous décrivons quelques techniques pour mettre en œuvre le dessin de contours dans Unity.
Techniques de base
Une technique courante consiste à dessiner un contour à partir des sommets de l’objet translatés le long de leurs normales. Cette technique nécessite deux passes.
Lors de la première passe, les sommets de l’objet sont translatés vers l’extérieur, suivant les normales, et sont rendus en utilisant la couleur de contour. Dans cette passe, le Front Culling est utilisé, de sorte que seules les faces internes du contour sont représentées. Lors du second passage, l’objet lui-même est rendu en utilisant le Back Culling.
Cette technique est facile à mettre en œuvre et donne des résultats satisfaisants lorsqu’elle est appliquée à des objets complexes.
Toutefois, lorsqu’elle est utilisée sur des objets simples, des artefacts peuvent apparaître quand la caméra capture l’objet sous certains angles. Ces artefacts sont plus perceptibles si le contour est épais et la caméra proche de l’objet.
Ces artefacts sont souvent négligés lors de l’écriture des shaders de contour parce que la plupart des jeux contiennent des objets assez complexes, placés relativement loin de la caméra. Mais si vous concevez un jeu du style Minecraft, où des blocs simples peuvent être affichés à proximité de la caméra, vous voudrez utiliser d’autres techniques.
Une façon simple de résoudre ce problème est de dessiner le contour par agrandissement de l’objet et le colorer de la couleur uniforme de son choix, plutôt que de déplacer les sommets le long de leurs normales pour créer le contour.
Mais cette technique exige que le modèle ait une largeur et une hauteur de même ordre de grandeur. Dans le cas contraire, le contour ne sera pas uniforme sur tous les bords de l’objet. De plus, un travail supplémentaire devra être réalisé pour faire apparaître tous les contours sur les modèles comportant des lacunes, ou ouvertures.
En résumé, les techniques de base de tracé de contours sont souvent adaptées pour un genre d’objets spécifique. Pour construire un shader de contour qui peut être utilisé avec une plus large gamme d’objets, des techniques plus avancées doivent être utilisées.
Techniques avancées
Une technique plus avancée pour dessiner le contour est de réaliser un rendu en fil de fer de l’objet (Wireframe) lors de la première passe, puis de dessiner l’objet lui-même à la seconde passe. Le fil de fer sera dessiné en traits épais, suivant les normales de l’objet.
Cette méthode provoque des artefacts aux angles du modèle. Pour lisser le contour à ces angles, nous pouvons dessiner des cercles de basse résolution à chaque sommet avant de dessiner le fil de fer.
Avec cette approche, il faut être sûr que le rendu filaire ne cache pas des pixels appartenant à l’objet. À cet effet, le Z-buffer du contour peut être modifié de telle sorte que le fil de fer soit tracé entièrement derrière l’objet, tout en étant devant d’autres objets plus éloignés de la caméra. Une façon de faire est de projeter les bords du filaire sur les faces de la boîte englobante (Bounding Box) faisant face à la caméra.
De façon plus pratique, on peut travailler avec les Stencil Buffers au lieu de modifier le Z-Buffer. Le modèle lui-même sera dessiné à la première passe tandis que la valeur du Z-Buffer est déterminée pour chaque pixel de l’objet dessiné. Puis la seconde passe, le contour est dessiné avec le fil de fer et les cercles à chaque sommet.
Pour ce second passage, le Stencil Buffer est configuré pour dessiner le contour seulement pour les pixels ne faisant pas partie de l’objet dessiné. Afin d’identifier ces pixels, nous comparons le contenu du Stencil Buffer avec la valeur déterminée à la première passe. Si les valeurs ne correspondent pas, le shader de pixels est appelé pour dessiner les pixels de contour.
Conclusion
Le choix d’une technique pour le dessin des contours dépend de la complexité de mise en œuvre, de la performance et de la précision de tracé souhaitées. Les shaders de contour avancés s’appliquent à une plus grande variété de modèles que les shaders de base. Ils peuvent être nécessaires si le jeu contient différents types d’objets qui peuvent être situés assez près de la caméra, jusqu’au point où les artefacts associés aux techniques simples peuvent devenir visibles.