1
\$\begingroup\$

I'm trying to create a shader in Unity with a slider that can adjust the transparency. (This is the first step toward something more sophisticated.) I try to do this by setting the alpha of the SurfaceOutputStandard struct to the texture alpha times a value between 0 and 1:

Shader "Custom/MakeVisible" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _TransparencyMult ("Transparency Mulitplier", Range(0,1)) = 1
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader {
        Tags { "RenderType"="Transparent" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;
        half _TransparencyMult;

        UNITY_INSTANCING_CBUFFER_START(Props)
        UNITY_INSTANCING_CBUFFER_END

        void surf (Input IN, inout SurfaceOutputStandard o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;

            //Multiply alpha by value between 0 and 1
            o.Alpha = c.a * _TransparencyMult; 
        }
        ENDCG
    }
}

This seems like it should work, since Alpha is an available property. But it doesn't. Here's a screenshot:

enter image description here

EDIT:

I realized after reading closer that I needed to add the alpha:fade parameter for that to work, however, when I add that it is always transparent no matter what:

enter image description here

EDIT: I changed the shader code according to Draco's answer:

Shader "Custom/MakeVisible" {
    Properties{
        _Color("Color", Color) = (1,1,1,1)
        _TransparencyMult("Transparency Mulitplier", Range(0,1)) = 1
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _Glossiness("Smoothness", Range(0,1)) = 0.5
        _Metallic("Metallic", Range(0,1)) = 0.0
    }
    SubShader {
        Tags { 
            "IgnoreProjector" = "True"
            "RenderType" = "Transparent"
            "Queue" = "Transparent"
        }
        LOD 200
        Blend SrcAlpha OneMinusSrcAlpha
        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows alpha
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;
        half _TransparencyMult;

        UNITY_INSTANCING_CBUFFER_START(Props)
        UNITY_INSTANCING_CBUFFER_END

        void surf(Input IN, inout SurfaceOutputStandard o) {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;

            //Multiply alpha by value between 0 and 1
            o.Alpha = c.a * _TransparencyMult;
        }
        ENDCG
    }
}

Now it is always the same transparency with no texture:

enter image description here

\$\endgroup\$
1
\$\begingroup\$

You need to make 3 small changes to your shader:

  1. You need to have the Queue properly set to Transparent or it won't render at all:

    Tags{
        "IgnoreProjector" = "True"
        "RenderType" = "Transparent"
        "Queue" = "Transparent"
    }
    
  2. You need to set up a Blend Mode (this goes in the same place as Tags and LOD), if left out, this will be assumed (there are other blend modes):

    Blend SrcAlpha OneMinusSrcAlpha
    
  3. You need to include the #pragma alpha in the #pragma declaration, this is what allows the alpha value to mean something:

    #pragma surface surf Standard fullforwardshadows alpha
    
| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ If IgnoreProjector tag is given and has a value of “True”, then an object that uses this shader will not be affected by Projectors. This is mostly useful on semitransparent objects, because there is no good way for Projectors to affect them. \$\endgroup\$ – Draco18s no longer trusts SE Nov 19 '17 at 4:39
  • \$\begingroup\$ I modified my shader, and now it's the same transparency no matter what. (I'll post an edit.) \$\endgroup\$ – AaronF Nov 19 '17 at 5:23
  • \$\begingroup\$ @AaronF Compare with this which looks like this with a color alpha value of 200 and a multiplier of 0.8 \$\endgroup\$ – Draco18s no longer trusts SE Nov 19 '17 at 5:26
  • \$\begingroup\$ Hmm. I'm not sure what's going on. I posted an edit with the results I got. \$\endgroup\$ – AaronF Nov 19 '17 at 5:29
  • 1
    \$\begingroup\$ @Parziphal Likely just inaccessible to you for some reason, I was able to view the archived chat history, which boils down to, essentially, "not your texture, your color" \$\endgroup\$ – Draco18s no longer trusts SE Feb 18 '19 at 14:48

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.