Unity: appliquer un effet d'image sur un seul calque

8

Veuillez considérer cette scène simple.

entrez la description de l'image ici

Il est composé de 3 objets de jeu différents. 1 image d'arrière-plan + 1 image de personnage statique + 1 petite partie (avec l'animal) qui est modifiée au moment de l'exécution pour effectuer une animation.

entrez la description de l'image ici

L'arrière-plan est rendu à l'aide d'une caméra dédiée. Le personnage (statique + anim) est rendu à l'aide d'une autre caméra dédiée. Les deux caméras sont définies sur Profondeur uniquement avec un masque d'abattage différent (chaque caméra ne rend que sa partie). Notez que la caméra en charge du personnage a une profondeur plus grande que celle en charge de l'arrière-plan (c'est-à-dire que le personnage est rendu après l'arrière-plan).

Je dois appliquer un effet d'image uniquement sur la caméra du personnage, mais je n'arrive pas à trouver un moyen pour que cet effet n'affecte pas l'arrière-plan.

Exemple ici avec un effet Vortex sur la caméra de personnage.

entrez la description de l'image ici

Comment feriez-vous une telle astuce?

lvictorino
la source

Réponses:

8

Le problème est que l'effet d'image saisit l'écran actuel après le rendu.

Étant donné que votre caméra effectue un rendu directement sur le backbuffer (ils n'effacent que la profondeur), l'effet d'image s'applique à tout.

La solution peut être:

  • Configurez d'abord une caméra claire avec une couleur transparente, avec une configuration RenderTarget (vous pouvez la créer par script afin qu'elle soit de la même taille que votre écran) et le post-processus souhaité.
  • Configurez une caméra en second lieu qui rend votre arrière-plan, clair à la couleur d'arrière-plan / skybox
  • Configurez une troisième caméra, qui ne rend rien (masque de tri défini sur Rien), n'efface rien et a le script AlphaBlit.cs qui lui est attaché. AlphaBlit a besoin de deux informations: un matériau qui utilise AlphaBlit.shader et le rendu cible pour se fondre (vous devrez l'affecter par script si vous l'avez créé par script à la 1ère étape)
  • Configurez une quatrième caméra qui rend votre personnage avancé.

ATTENTION: il s'agit d'un algorithme de peintre. Cela signifie que tout le troisième rendu de la caméra est rendu par-dessus ce qui existe déjà, et la quatrième caméra rendra par-dessus.

Je ne suis pas sûr qu'il existe un moyen de faire mieux, car il faudrait aussi déformer le buffer de profondeur, ce qui n'est pas possible ... (non sans rendre directement avec un effet vortex qui est plus difficile) ...

Bien sûr, la façon la plus optimisée de le faire serait de ne pas appliquer le post-processus sur la 1ère caméra, mais simplement de le rendre dans un rendu et de modifier le AlphaBlit.shader pour faire l'effet vortex comme il blit ce RenderTarget. Mais c'est plus complexe.

Sirithang
la source
Merci pour votre réponse. J'ai quelques problèmes avec "Rendre une caméra avec un script qui fait simplement dans OnRenderImage un Blit de ce RenderTarget dans la cible de rendu de destination (c'est-à-dire le backbuffer ici)". .. car même si la couleur est noire transparente tout est noir une fois blit.
lvictorino
réponse modifiée avec plus de précision
Sirithang
Le flux de travail de la solution de base est très bien, mais je suis confronté à un problème inattendu avec alpha ici. En fait, je veux brouiller les niveaux de premier plan. Cette solution fonctionne, mais elle semble en quelque sorte câblée. puu.sh/C6sSB/ca5d5162b0.jpg Si je change la couleur des drapeaux clairs en Magenta avec 0 transparence, il a un étrange contour magenta sur les côtés (doit être juste transparent). puu.sh/C6sSB/ca5d5162b0.jpg . Cela rend la solution entière ne fonctionne pas pour moi. Je ne sais pas vraiment pourquoi cela se produit. La commutation de drapeaux clairs n'aide pas.
AvrDragon