Shaders are not entirely obvious so it's perfectly reasonable to ask for help with them.
There are three things that you should concern yourself with when making a shader transparent:
- Blend mode. Should be something like `Blend SrcAlpha OneMinusSrcAlpha`
- Culling. Should be on.
- Render Queue. Not entirely as breaking, but still important. Your subshader tags should be something like `Tags {"Queue"="Transparent" "RenderType"="Transparent"}`
The Toon Outline shaders already take care of blending the alpha for the outlines, although changing the subshaders' render queue wouldn't hurt. All you really need to worry about is the basic shader. If you remove the `Cull Off` statements from each pass, add `Blend SrcAlpha OneMinusSrcAlpha` to each pass and change the Subshader Tags to `Tags {"Queue"="Transparent" "RenderType"="Transparent"}`, you will achieve what you are looking for:
Shader "Toon/Basic" {
Properties {
_Color ("Main Color", Color) = (.5,.5,.5,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_ToonShade ("ToonShader Cubemap(RGB)", CUBE) = "" { Texgen CubeNormal }
}
SubShader {
Tags {"Queue"="Transparent" "RenderType"="Transparent"} //Change this
Pass {
Name "BASE"
//Cull Off //Remove this
Blend SrcAlpha OneMinusSrcAlpha //Add This
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
sampler2D _MainTex;
samplerCUBE _ToonShade;
float4 _MainTex_ST;
float4 _Color;
struct appdata {
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
float3 normal : NORMAL;
};
struct v2f {
float4 pos : POSITION;
float2 texcoord : TEXCOORD0;
float3 cubenormal : TEXCOORD1;
};
v2f vert (appdata v) {
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
o.cubenormal = mul (UNITY_MATRIX_MV, float4(v.normal,0));
return o;
}
float4 frag (v2f i) : COLOR {
float4 col = _Color * tex2D(_MainTex, i.texcoord);
float4 cube = texCUBE(_ToonShade, i.cubenormal);
return float4(2.0f * cube.rgb * col.rgb, col.a);
}
ENDCG
}
}
SubShader {
Tags {"Queue"="Transparent" "RenderType"="Transparent"} //Change this
Pass {
Name "BASE"
//Cull Off //Remove this
Blend SrcAlpha OneMinusSrcAlpha //Add this
SetTexture [_MainTex] {
constantColor [_Color]
Combine texture * constant
}
SetTexture [_ToonShade] {
combine texture * previous DOUBLE, previous
}
}
}
Fallback "VertexLit"
}
Bear in mind that the outline is using the outline color's alpha while the surface uses the color's alpha. If you want both to use the color's alpha, you would have to adjust the fragment program of the outline to use that value:
Shader "Toon/Basic Outline" {
Properties {
_Color ("Main Color", Color) = (.5,.5,.5,1)
_OutlineColor ("Outline Color", Color) = (0,0,0,1)
_Outline ("Outline width", Range (.002, 0.03)) = .005
_MainTex ("Base (RGB)", 2D) = "white" { }
_ToonShade ("ToonShader Cubemap(RGB)", CUBE) = "" { Texgen CubeNormal }
}
CGINCLUDE
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f {
float4 pos : POSITION;
float4 color : COLOR;
};
uniform float4 _Color; //Add This
uniform float _Outline;
uniform float4 _OutlineColor;
v2f vert(appdata v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
norm.x *= UNITY_MATRIX_P[0][0];
norm.y *= UNITY_MATRIX_P[1][1];
o.pos.xy += norm.xy * o.pos.z * _Outline;
o.color = float4(_OutlineColor.rgb, _Color.a); //Change this
return o;
}
ENDCG
SubShader {
Tags {"Queue"="Transparent" "RenderType"="Transparent"} //Change this if you like
UsePass "Toon/Basic/BASE"
Pass {
Name "OUTLINE"
Tags { "LightMode" = "Always" }
Cull Front
ZWrite On
ColorMask RGB
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
half4 frag(v2f i) :COLOR { return i.color; }
ENDCG
}
}
SubShader {
Tags {"Queue"="Transparent" "RenderType"="Transparent"} //Change this if you like
UsePass "Toon/Basic/BASE"
Pass {
Name "OUTLINE"
Tags { "LightMode" = "Always" }
Cull Front
ZWrite On
ColorMask RGB
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma exclude_renderers gles xbox360 ps3
ENDCG
SetTexture [_MainTex] { combine primary }
}
}
Fallback "Toon/Basic"
}