Je veux obtenir dans Unity un effet transparent comme celui de ces exemples:
Dans mon scénario spécifique, il y a quelques exigences:
- Les sprites utilisent le mélange alpha et les sprites ont des zones transparentes.
- Il y a 2 types d'éléments qui occlus le personnage. L'un doit créer l'effet silhouette et l'autre doit se comporter comme d'habitude.
Pour occlure des éléments qui créent la silhouette, j'active ZWrite et le désactive pour les éléments qui ne le font pas.
Pour le personnage, j'ai essayé de définir la file d'attente du shader sur transparent + 1, et j'ai ajouté ce passage:
Pass
{
ZTest Greater
Lighting Off
Color [_Color]
}
Et l'effet fonctionne partiellement:
La silhouette est dessinée sur tout le personnage, même les parties transparentes. Les parties transparentes ne doivent pas créer de silhouette.
La silhouette est créée lorsque le personnage se trouve derrière un sprite, même si cette partie du sprite est transparente. Être derrière une partie transparente du sprite ne doit pas créer la silhouette.
Le personnage apparaît devant les autres éléments, même s'il est derrière eux. Je suppose que c'est parce que la configuration de la file d'attente est Transparent + 1. Mais si je le laisse transparent, le personnage est dessiné dans le bon ordre, mais la silhouette n'est jamais vue.
J'ai essayé de suivre ces conseils que quelqu'un m'a donnés, mais je n'arrive pas à le faire fonctionner:
1) Laissez le col qui rend les sprites tels quels.
2) Ajoutez une passe qui écrit dans le z-buffer, mais qui a un shader qui utilise clip () pour éliminer les pixels basés sur alpha. Vous ne pouvez pas utiliser le z-buffer pour effectuer des tests z doux sans utiliser la couverture MSAA et alpha-to. La qualité ne sera pas excellente, mais c'est le mieux que vous puissiez faire. Une alternative plus rapide est un tramage de motif ou de bruit, ou un bon seuil à l'ancienne si vos sprites ont tous des bords assez nets.
3) Ajoutez une troisième passe aux objets occluables qui dessine la couleur d'occlusion à l'aide du test z et assurez-vous qu'elle est dessinée comme une passe finale.
Je suis un peu nouveau pour les shaders, spécialement dans Unity, et je n'arrive pas à comprendre comment le faire fonctionner correctement.