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 Answer 1

2
\$\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
    
\$\endgroup\$
12
  • \$\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\$ Commented Nov 19, 2017 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
    Commented Nov 19, 2017 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\$ Commented Nov 19, 2017 at 5:26
  • \$\begingroup\$ Hmm. I'm not sure what's going on. I posted an edit with the results I got. \$\endgroup\$
    – AaronF
    Commented Nov 19, 2017 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\$ Commented Feb 18, 2019 at 14:48

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .