Sto provando a scrivere uno shader per l'unità che evidenzi i frammenti sovrapposti delle mesh. Dovrebbe funzionare per un oggetto che si sovrappone a se stesso così come a più oggetti.Unity Shader che evidenzia sovrapposizioni
Il risultato dovrebbe apparire come un'immagine allegata.
Prima ho provato a realizzare questo con il rilevamento delle collisioni ma penso che il modo migliore sia scrivere uno shader.
Non ho molta familiarità con gli shader quindi se qualcuno potesse aiutarmi sarei grato.
Penso che si possa fare usando stencil shader come qui http://docs.unity3d.com/Manual/SL-Stencil.html ma questi shader rendono solo l'intersezione di due oggetti senza rendere l'intero oggetto.
Ho anche trovato degli shader in base a Profondità (https://chrismflynn.wordpress.com/2012/09/06/fun-with-shaders-and-the-depth-buffer/), ma questo funziona anche su due oggetti e non funziona su una maglia che si
sovrappongono quanto riguarda @Zze commento con l'idea circa due Passo ho ora due shader . E funziona su due oggetti quando uno ha uno shader e l'altro ha un secondo.
Forse qualcuno può aiutarmi a combinarlo in uno shader che funzionerà anche in un oggetto che si sovrapporrà?
ShaderOne
Shader "Custom/ShaderOne"
{
SubShader {
Tags { "RenderType"="Opaque" "Queue"="Geometry"}
Pass {
Stencil {
Ref 2
Comp always
Pass keep
Fail decrWrap
ZFail keep
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 pos : SV_POSITION;
};
v2f vert(appdata v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
half4 frag(v2f i) : SV_Target {
return half4(0,1,0,1);
}
ENDCG
}
Pass {
Stencil {
Ref 2
Comp equal
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 pos : SV_POSITION;
};
v2f vert(appdata v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
half4 frag(v2f i) : SV_Target {
return half4(0,0,1,1);
}
ENDCG
}
}
}
ShaderTwo
Shader "Custom/ShaderTwo"
{
SubShader {
Tags { "RenderType"="Opaque" "Queue"="Geometry"}
Pass {
Stencil {
Ref 2
Comp always
Pass replace
ZFail keep
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 pos : SV_POSITION;
};
v2f vert(appdata v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
half4 frag(v2f i) : SV_Target {
return half4(1,0,0,1);
}
ENDCG
}
}
}
Il risultato appare come un'immagine associata
Se lo shader stencil rende i punti di intersezione, allora perché non si fa a fare uno shader con 2 passaggi, il primo trae normalmente e poi la seconda imita il risultato dello shader stencil? – Zze
Si potrebbe voler guardare la nozione di peeling di profondità. Vedi [qui] (http: //www.opengl-tutorial.org/intermediate-tutorials/tutorial-10-transparency /) e [here] (http://www.eng.utah.edu/~cs5610/handouts/order_independent_transparency.pdf). Anche quanti oggetti hai intenzione di avere. Se non molti si potrebbe voler rendere ogni oggetto a una trama e quindi combinarli come un buffer di accumulo. – mrVoid
@mrVoid Penso che i test di profondità funzioneranno in questa situazione solo con la vista dall'alto della fotocamera, ma quando sarà in prospettiva non funzionerà? Ho mal di testa da questo. forse puoi fornirmi qualche esempio di utilizzo con codice di esempio? – seek