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"
}
Usi il LOD? Come LOD 250? Se sì rimuovilo. –
Nessun LOD incluso. Grazie per il puntatore però. – moosefetcher
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