# Modifying Alpha in Unity Standard Shader

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
}
Tags { "RenderType"="Transparent" }
LOD 200

CGPROGRAM
#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:

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:

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
}
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:

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

• 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. – Draco18s no longer trusts SE Nov 19 '17 at 4:39
• I modified my shader, and now it's the same transparency no matter what. (I'll post an edit.) – AaronF Nov 19 '17 at 5:23
• @AaronF Compare with this which looks like this with a color alpha value of 200 and a multiplier of 0.8 – Draco18s no longer trusts SE Nov 19 '17 at 5:26
• Hmm. I'm not sure what's going on. I posted an edit with the results I got. – AaronF Nov 19 '17 at 5:29
• @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" – Draco18s no longer trusts SE Feb 18 '19 at 14:48