2016-02-05 13 views
12

Sto facendo un gioco di esplorazione spaziale in Unity e sto avendo due problemi con la semitrasparenza.Rappresenta correttamente la sfera semitrasparente in Unity5

Ogni pianeta è costituito da due sfere: una è lo strato combinato di nuvole e superfici, l'altra (con un raggio leggermente più grande) raffigura l'orizzonte "splendore" selezionando le facce anteriori e l'alfa sfumato verso il bordo esterno del sfera. Questo funziona MOLTO, ma con i seguenti due problemi:

1) Nel mio shader di superficie personalizzato, quando uso la parola chiave alpha nella definizione #pragma, alpha viene scomposto nella sfera renderizzata, ma il 'glow' la sfera scompare a una distanza di alcune migliaia di unità. Se NON includo la parola chiave alpha, la sfera non svanisce verso il bordo, ma la rende a distanza.

2) Nonostante abbia provato tutte le opzioni RenderType, Queue, ZWrite e ZDepth, la sfera di superficie e la sfera 'glow' sono z-fighting; il gioco non sembra decidere quali siano i poligoni più vicini, nonostante il fatto che le facce vicine alla sfera luminosa debbano essere abbattute. Ho persino provato a spingere la sfera luminosa lontano dalla videocamera del giocatore e ad espandere il suo raggio della stessa proporzione, ma sono ANCORA, inspiegabilmente, ottenendo il z-combattimento tra le sfere!

C'è qualche impostazione che mi manca che consentirà alla sfera di 'bagliore' di essere sempre disegnata DIETRO la sfera di superficie (dato che ho provato TUTTE le combinazioni di ZWrite, ZDepth come sopra descritto) e c'è un modo avere un oggetto abilitato alfa NON scompare a distanza?

Non riesco a capirlo, quindi qualsiasi aiuto sarà apprezzato!

EDIT
Ecco il codice dello shader per la mia 'bagliore sfera'. Le facce anteriori sono abbattute. Ho persino provato la parola chiave Offset per "spingere" qualsiasi poligono estratto dalla fotocamera. E ho provato tutte le opzioni Tag, ZWrite e ZTest che sono riuscito a trovare. Lo shader viene passato un colore di tinta, un galleggiante densità di atmosfera e un vettore di direzione del sole ...

Shader "Custom/planet glow" { 
    Properties { 
     _glowTint ("Glow Tint", Color) = (0.5,0.8,1,1) 
     _atmosphereMix ("Atmosphere Mix", float) = 0 
     _sunDirection ("Sun Direction", Vector) = (0, 0, 0, 0) 
    } 
    SubShader { 
     Tags { "RenderType" = "Opaque" "Queue" = "Geometry" } 
     Cull Front // I want only the far faces to render (behind the actual planet surface) 
     Offset 10000, 10000 
     ZWrite On // Off also tried 
     ZTest LEqual // I have tried various other options here, incombination with changing this setting in the planet surface shader 

     CGPROGRAM 
     #pragma surface surf Lambert alpha 
     #pragma target 4.0 

     struct Input { 
      float3 viewDir; 
     }; 

     fixed4 _glowTint; 
     float _atmosphereMix; 
     float4 _sunDirection; 

     void surf (Input IN, inout SurfaceOutput o) { 
      _sunDirection = normalize(_sunDirection); 
      o.Albedo = _glowTint; 
      float cameraNormalDP = saturate(dot(normalize(IN.viewDir), -o.Normal) * 4.5); 
      float sunNormalDP = saturate(dot(normalize(-_sunDirection), -o.Normal) * 2); 
      o.Alpha = _atmosphereMix * sunNormalDP * (cameraNormalDP * cameraNormalDP * cameraNormalDP); // makes the edge fade 'faster'    
      o.Emission = _glowTint; 
     } 

     ENDCG 
    } 
    FallBack "Diffuse" 
} 
+0

Usi il LOD? Come LOD 250? Se sì rimuovilo. –

+0

Nessun LOD incluso. Grazie per il puntatore però. – moosefetcher

+0

Puoi includere il codice del tuo shader qui? Non riesco a pensare a nulla che possa causare questo effetto. Inoltre, ZTest Off è un'opzione valida, nonostante non sia elencata nel Manuale di unità ufficiale. – HalpPlz

risposta

0

mi sembra di aver inciampato su una soluzione a questo problema durante il tentativo di risolvere mondo-spazio 'jitter' .. Il gioco che sto sviluppando utilizza grandi distanze. Ho cambiato il modo in cui gli oggetti a lunga distanza sono posizionati (le distanze si contraggono più un oggetto è lontano dalla fotocamera) e questo ha risolto lo z-fighting e l'alfa che svanisce. Un intero sistema solare si adatta a qualcosa come 300.000 chilometri usando la radice quadrata della distanza divisa per la distanza e moltiplicando il relativo Vector3 e la scala dell'oggetto per quello. Speriamo che questa informazione possa essere utile a qualcuno.

0

Se si utilizza alpha, è necessario modificare i tag per rendere l'alfa nel passaggio della trasparenza. Disattiva anche ZWrite. E rimuovere l'offset.

Ho testato il tuo shader in un progetto vuoto con entrambi i rendering Forward e Deferred. Ha funzionato bene con questi aggiustamenti.

Tutte le geometrie opache vengono disegnate per prime, quindi il passaggio alfa viene eseguito e rende tutti gli oggetti con trasparenza su TOP di tutti gli oggetti nella scena. Deve farlo altrimenti non sarà in grado di fondere i colori per l'alfa.

Tags { "RenderType" = "Transparent" "Queue" = "Transparent" } 
ZWrite Off 
0

Avete mai pensato di rendering di oggetti di grandi dimensioni in una scala diversa in un'altra fotocamera per creare skybox dinamica? Questo risolverà sicuramente i problemi di z-fighting. Si possono avere, ad esempio, due telecamere - una che esegue il rendering di oggetti nell'intervallo 0,1-1000 e altre, che varia da 1000 a 100000.

L'ottimizzazione aggiuntiva può includere l'ambiente di rendering da lontano al cubo skybox e farlo non ogni frame (tranne forse occasioni speciali quando si distrugge un pianeta da lontano).

C'è anche un'altra preoccupazione relativa all'ottimizzazione: è possibile eseguire il rendering di un anello piatto attorno al pianeta, ruotandolo di fronte alla telecamera, per evitare di scavalcarla completamente sulla superficie del pianeta. Ma ciò richiederà calcoli di illuminazione più complessi, a quanto pare.

Inoltre, hai provato lo shader trasparente su una fotocamera che non ha Skybox come contrassegni chiari? Controlla this answer su come usare skybox personalizzato.

+0

Benvenuti in StackOverflow! La prossima volta, prova a postare un codice di esempio come risposta, poiché i collegamenti potrebbero non essere validi. – cdomination

+0

Il codice Skybox non è rilevante per questa risposta. – mcfrei

Problemi correlati