- Home /
Shader Help? Need an Alpha Test, then a "set pixel" sort of command
Hello hello!
Recently I've been trying to set up a shader (or shaders) for simple 2D fluids that can do two things, in order:
Run an alpha test on a texture input (from a render texture).
Set any pixel which does not get cut in the alpha test to an EXACT UNIFORM color and alpha value, then output that texture to be applied on a plane (plane must be able to have semi-transparency when rendered with a normal camera).
No lighting, no bump, no sneaky vertex operations, just plain old pixel output. This doesn't seem too tricky, but I've had astonishing difficulty with it! I've tested lots and lots of alpha testing code that is floating around in Unity forums here and there (especially this one http://wiki.unity3d.com/index.php/VegetationTwoPass), but to no avail. Generally the output is either black with full alpha, or a severely darkened color of choice, again with full alpha.
I'm also no shader programmer myself, so my main troubles here may even relate to simple syntax.
Can anybody point me in the direction of a shader, or help me write a shader, which performs this seemingly simple functionality? Cgprogram surface shaders are prefered, but I'd be okay doing vertex and fragment operations if need be. At the end of the day, it's just gotta work.
Answer by jfjordanfarr · Jul 22, 2015 at 12:44 AM
Solved!
Here's the shader code itself:
Shader "Custom/JordanAlphaTest" {
Properties {
_Color ("Main Color", Color) = (.5, .5, .5, .5)
_MainTex ("Diffuse (RGB) Alpha (A)", 2D) = "white" {}
_Cutoff ("Base Alpha cutoff", Range (0,1)) = .5
}
SubShader {
Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
fixed _Cutoff;
fixed4 _Color;
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.texcoord.xy;
return o;
}
float4 frag(v2f i) : COLOR
{
float4 c = tex2D(_MainTex, i.uv);
clip(c.a - _Cutoff);
c.rgb = _Color.rgb;
c.a = _Color.a;
return c;
}
ENDCG
}
}
}
This shader was applied to a stretched quad which follows the main camera around. MainTex is a Render Texture. I also had to separately apply a sorting layer and order in layer to the quad (just in an attached script) to get this to not cover up 2D objects in the scene. Lastly, applying a blur camera effect to the Render Texture camera greatly improved the fluid look.