Hi! I'm very new to Shaders in Unity but have been able to develop something that resembles what I'm looking for. What I have done is create a shader that when applied to a texture and then to any object, when it intersects with any other object, an alpha mask is created in place of said intersection.
Example with shader texture applied to a sphere.
Scene Shaded: ![alt text][1]
Scene Alpha Channel: ![alt text][2]
Shader Code:
Shader "Mask"
{
Properties {
_Color("Color", Color) = (1,1,1,1)
}
Category {
Tags {"RenderType" = "Opaque" "Queue"="Transparent"}
Color [_Color] // change alpha in material to tweak mask strength
SubShader
{
//Rendertype: Opaque, Transparent or Overlay all give same result...
//Queue is important here! Must be over 2500 to get front to back rendering, Overlay = 4000 (Transparent also works..)
Tags { "RenderType"="Opaque" "Queue" = "Overlay" }
LOD 100
ZWrite Off
//first pass sets the mask for the "front geometry"
Pass
{
ColorMask 0
Cull Back
ZTest Greater
Stencil {
Ref 1
Comp Always
Pass Replace
}
}
//second pass turn off culling, could be Cull Off or Cull Front (both acheive the same thing)
//use the mask from the first pass
Pass
{
Cull Off
ZTest Greater
ColorMask A
Stencil {
Ref 1
Comp NotEqual
}
}
// reset the stencil buffer so other objects dont mask out this one
Pass
{
//Cull Back
ZTest Greater
ColorMask 0
Stencil {
Ref 0
Comp Always
Pass Zero
}
}
}
}
}
Unfortunatly I would like to have the alpha value increase with the distance to the center of the object the texture is applied to (knowing that I want to have this texture applied to multiple different objects at the same time) in order to create a more subtle transition between the masked and non-masked surfaces, but I'm struggling a lot to achieve it, any idea on how I could solve my problem?
Thank you in advance :)
[1]: /storage/temp/186043-a.png
[2]: /storage/temp/186044-b.png
↧