2
votes

I'm newbie in Shader Programing. I created a simple shader with a radial gradient, and when they intersect, I want increase transpency. I would like something like this effect: Image transperent two objects

SubShader {
    Tags { "Queue" = "Geometry+10" }
    Pass{
        ColorMask rgb   
        //ZWrite On
        Blend Zero OneMinusSrcAlpha 
        CGPROGRAM 
        #pragma vertex vert
        #pragma fragment frag
        float4 _Color;
        float4 _ColorDark;
        float _Radius;
        //float _Offset;
        float _Strength;
        struct vertexInput {
            float4 vertex : POSITION;
        };
        struct vertexOutput {
            float4 pos : SV_POSITION;
            float4 posInObjectCoords : TEXCOORD0;
        };
        vertexOutput vert(vertexInput input) 
        {
            vertexOutput output;
            output.pos =  mul(UNITY_MATRIX_MVP, input.vertex);
            output.posInObjectCoords = input.vertex; 
            return output;
        }
        float4 frag( vertexOutput  input) : COLOR 
        {
            float z = input.posInObjectCoords.z * input.posInObjectCoords.z ;
            float x = input.posInObjectCoords.x * input.posInObjectCoords.x ;
            float r = _Radius * _Radius;
            float alf = (x+z) / r;
            return float4 (_ColorDark.r , _ColorDark.g ,_ColorDark.b, alf * _Strength);
        }
        ENDCG
    }
}

Yeah, maybe code is not so beauty, but for tests it's useful. Thank you for any answer!

2

2 Answers

1
votes

Just use additive blending instead alpha blending.

Blend SrcAlpha One or Blend One One

0
votes

Try this

...
Tags { "Queue" = "Transparent" }
Pass{
    ColorMask rgb   
    //ZWrite On
    Blend SrcAlpha OneMinusSrcAlpha
    ...