Home > other >  How can I add transparency (alpha) to this shader?
How can I add transparency (alpha) to this shader?

Time:03-29

This is a custom "jelly" shader that I've been trying to alter so that it can allow transparency (alpha). I can't seem to figure it out despite changing the #pragma and Subshader Tag. Any help or insight with this would be appreciated. I find Shaders incredibly confusing to edit and manipulate. Thanks in advance.

    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
        
        _ControlTime ("Time", float) = 0
        _ModelOrigin ("Model Origin", Vector) = (0,0,0,0)
        _ImpactOrigin ("Impact Origin", Vector) = (-5,0,0,0)

        _Frequency ("Frequency", Range(0, 1000)) = 10
        _Amplitude ("Amplitude", Range(0, 5)) = 0.1
        _WaveFalloff ("Wave Falloff", Range(1, 8)) = 4
        _MaxWaveDistortion ("Max Wave Distortion", Range(0.1, 2.0)) = 1
        _ImpactSpeed ("Impact Speed", Range(0, 10)) = 0.5
        _WaveSpeed ("Wave Speed", Range(-10, 10)) = -5
    }
    SubShader {
        Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType"="Transparent" }
        LOD 200
        
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows addshadow vertex:vert

        // Use shader model 3.0 target, to get nicer looking lighting
#pragma surface surf NoLighting alpha

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        float _ControlTime;
        float4 _ModelOrigin;
        float4 _ImpactOrigin;

        half _Frequency; //Base frequency for our waves.
        half _Amplitude; //Base amplitude for our waves.
        half _WaveFalloff; //How quickly our distortion should fall off given distance.
        half _MaxWaveDistortion; //Smaller number here will lead to larger distortion as the vertex approaches origin.
        half _ImpactSpeed; //How quickly our wave origin moves across the sphere.
        half _WaveSpeed; //Oscillation speed of an individual wave.

        // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
        // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
        // #pragma instancing_options assumeuniformscaling
        UNITY_INSTANCING_BUFFER_START(Props)
            // put more per-instance properties here
        UNITY_INSTANCING_BUFFER_END(Props)

        void vert (inout appdata_base v) {
            float4 world_space_vertex = mul(unity_ObjectToWorld, v.vertex);

            float4 direction = normalize(_ModelOrigin - _ImpactOrigin);
            float4 origin = _ImpactOrigin   _ControlTime * _ImpactSpeed * direction;
            
            //Get the distance in world space from our vertex to the wave origin.
            float dist = distance(world_space_vertex, origin);

            //Adjust our distance to be non-linear.
            dist = pow(dist, _WaveFalloff);

            //Set the max amount a wave can be distorted based on distance.
            dist = max(dist, _MaxWaveDistortion);

            //Convert direction and _ImpactOrigin to model space for later trig magic.
            float4 l_ImpactOrigin = mul(unity_WorldToObject, _ImpactOrigin);
            float4 l_direction = mul(unity_WorldToObject, direction);

            //Magic
            float impactAxis = l_ImpactOrigin   dot((v.vertex - l_ImpactOrigin), l_direction);

            v.vertex.xyz  = v.normal * sin(impactAxis * _Frequency   _ControlTime * _WaveSpeed) * _Amplitude * (1 / dist);
        }

        void surf (Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = _Color.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

CodePudding user response:

You are missing the Blend instruction to tell the pipeline how to mix the rendered colors with the old ones. In addition to that you have a duplicate #pragma instruction.

The Subshader tag only tell the pipeline when to render your objects. Usually you want to render opaque objects first so you can skip hidden transparent objects.

Here you can find infos about how to define Blending for transparent objects: https://docs.unity3d.com/Manual/SL-Blend.html

All you need to change is:

// Add    
Blend SrcAlpha OneMinusSrcAlpha


// Only one pragma line i.e.
#pragma surface surf Standard fullforwardshadows addshadow vertex:vert alpha

Hope that helps. Though I didn't check your wave stuff...

  • Related