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