- Home /
Separate color/alpha blending problem
I am trying to create a shader which alpha blends a solid color over some rendered geometry in a second pass. I do this to highlight the object in the world as can be seen in games like Return To Castle Wolfenstein. I plan to do this by storing the blend factor in the src alpha channel in the second pass and use this as a blend factor when blending with the geometry rendered in the first pass. My shader code is as follows:
Shader "Custom/Color" { Properties { _Color ("Main Color", Color) = (1,0.5,0.5,1) _MainTex("Base (RGB)", 2D) = "white" {} _Cutoff("Alpha cutoff", Range(0, 1)) = 0.5 } SubShader { Tags { "Queue" = "AlphaTest" "RenderType" = "TransparentCutout" }
//Cull front
CGPROGRAM
#pragma surface surf Ramp alphatest:_Cutoff vertex:vert
float4 _Color;
sampler2D _MainTex;
// Set by script:
// Shader.SetGlobalTexture("_Ramp", MY_TOON_RAMP)
sampler2D _Ramp;
struct Input
{
float2 uv_MainTex;
float3 worldNormal;
};
void vert(inout appdata_full v, out Input o)
{
//v.normal = v.normal * -1;
}
half4 LightingRamp(SurfaceOutput s, half3 lightDir, half atten)
{
half NdotL = dot(s.Normal, lightDir);
half diff = NdotL * 0.5 + 0.5;
half3 ramp = tex2D(_Ramp, float2(diff)).rgb;
half4 c;
c.rgb = s.Albedo * _LightColor0.rgb * ramp * (atten * 2);
c.a = s.Alpha;
return c;
}
void surf (Input IN, inout SurfaceOutput o)
{
half4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
//Cull front
Blend SrcAlpha OneMinusSrcAlpha, Zero One
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _Color;
sampler2D _MainTex;
float _factor;
struct v2f {
float4 pos : SV_POSITION;
float3 color : COLOR0;
float2 uv : TEXCOORD0;
};
float4 _MainTex_ST;
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.color = _Color;
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
half4 frag (v2f i) : COLOR
{
half4 texcol = tex2D(_MainTex, i.uv);
//return (texcol*2) * _Color;
float4 color = _Color;
color.a = texcol.a;
return color;
}
ENDCG
}
}
FallBack "Diffuse"
}
The important line is:
Blend SrcAlpha OneMinusSrcAlpha, Zero One. Here I intend to use the alpha channel of the prerendered object which has the cookie cutter code so I still get the cookie cutter effect (via the seperate alpha channel blend Zero One) but this has no effect. The separate alpha channel blend is ignored. I would expect that if I set this to Zero Zero nothing would be rendered but it is still rendered and the alpha channel blend is performed using the color channel blend factors. How do I perform separate alpha channel blending?