Voglio ottenere in Unity un effetto trasparente come quello di questi esempi:
Nel mio scenario specifico ci sono un paio di requisiti:
- Gli sprite utilizzano la fusione alfa e gli sprite hanno aree trasparenti.
- Ci sono 2 tipi di elementi che occludono il personaggio. Uno dovrebbe creare l'effetto silhouette e l'altro dovrebbe comportarsi come al solito.
Per nascondere elementi che creano la silhouette, abilito ZWrite e lo disabilito per elementi che non lo fanno.
Per il personaggio ho provato a impostare la coda dello shader su trasparente + 1 e ho aggiunto questo passaggio:
Pass
{
ZTest Greater
Lighting Off
Color [_Color]
}
E l'effetto funziona parzialmente:
La silhouette è disegnata su tutto il personaggio, anche le parti che sono trasparenti. Le parti trasparenti non dovrebbero creare una silhouette.
La silhouette viene creata quando il personaggio si trova dietro uno sprite, anche se quella parte dello sprite è trasparente. Essere dietro una parte trasparente dello sprite non dovrebbe creare la silhouette.
Il personaggio appare davanti al resto degli elementi, anche se è dietro di loro. Immagino che ciò sia dovuto all'impostazione della coda su Trasparente + 1. Ma se lo lascio trasparente, il personaggio viene disegnato nell'ordine corretto, ma la silhouette non viene mai vista.
Ho provato a seguire questi suggerimenti che qualcuno mi ha dato, ma non riesco a farlo funzionare:
1) Lascia il passaggio che rende gli sprite così come sono.
2) Aggiungi un passaggio che scrive nel buffer z, ma ha uno shader che utilizza clip () per scartare i pixel in base all'alfa. Non è possibile utilizzare il buffer z per eseguire test z soft senza utilizzare MSAA e la copertura alpha-to. La qualità non sarà eccezionale, ma è il massimo che puoi fare. Un'alternativa più veloce è un dithering di pattern o noise o una buona soglia vecchio stile se i tuoi sprite hanno bordi abbastanza nitidi.
3) Aggiungi il terzo passaggio agli oggetti occludibili che disegnano il colore dell'occlusione usando il test z e assicurati che sia disegnato come passaggio finale.
Sono un po 'nuovo per gli shader, specialmente in Unity, e non riesco proprio a capire come farlo funzionare correttamente.