Próbuję napisać shader dla jedności, która będzie podkreślać nakładających się fragmentów oczek. Powinien działać dla jednego obiektu nakładającego się na siebie, jak również wielu obiektów.Unity Shader podświetlanie pokrywa
Wynik powinien wyglądać załączonym obrazku.
Najpierw próbowałem to zrobić z wykrywaniem kolizji, ale myślę, że najlepszym sposobem jest napisanie modułu cieniującego.
nie jestem bardzo obeznany z shaderów więc jeśli ktoś może mi pomóc byłbym wdzięczny.
Myślę, że można to zrobić za pomocą szablonów cieniowania, takich jak tutaj http://docs.unity3d.com/Manual/SL-Stencil.html , ale te shadery renderują tylko przecięcie dwóch obiektów bez renderowania całego obiektu.
Znalazłem również shader oparte na głębokość (https://chrismflynn.wordpress.com/2012/09/06/fun-with-shaders-and-the-depth-buffer/), ale również działać na dwóch obiektach i nie działa na jednej siatki, które pokrywają się
Odnośnie komentarza @Zze z pojęcia o Dwuprzebiegowe Mam teraz dwa shaderów . I działa na dwóch obiektach, gdy jeden ma jeden moduł cieniujący, a drugi drugi.
Może ktoś może mi pomóc, jak połączyć je w jeden moduł cieniujący, który będzie działał także w obiekt, który będzie pokrywać się?
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
}
}
}
wynik wygląda na załączonym obrazem
Jeśli shader szablon renderuje punkty przecięcia, to dlaczego nie można zrobić shader z 2 przejazdów, pierwszy rysuje normalnie a potem drugi naśladuje wyniku cieniującego szablonu? – Zze
Być może zechcesz spojrzeć na pojęcie głębokiego obierania. Zobacz [tutaj] (http: //www.opengl-tutorial.org/intermediate-tutorials/tutorial-10-transparency /) i [here] (http://www.eng.utah.edu/~cs5610/handouts/order_independent_transparency.pdf). Również ile obiektów planujesz mieć. Jeśli nie wiele, możesz chcieć renderować każdy obiekt do tekstury, a następnie łączyć je jak bufor akumulacyjny. – mrVoid
@ mrVoid Myślę, że testowanie głębokości zadziała w tej sytuacji tylko z widokiem z góry aparatu - ale kiedy będzie to perspektywa, to nie zadziała? Mam z tego ból głowy. może możesz podać mi przykład użycia go z przykładowym kodem? – seek