- Home /
Shader not working in OpenGL (Working in DirectX)
This is my first attempt at writing a shader and I'm guessing this is something easy but... my lack of knowledge in this arena is not allowing me to deduce what's going on. I've done hours worth of searching but I'm having a difficult time even understanding what, exactly, I should be searching FOR.
This shader takes a second texture which is a black to white gradient to use as an alpha cutoff. I found better results using this method with 2D sprites (_MainTex) than I did using an alpha layer on the 2D sprite texture itself. It provided a smoother transition through all cutoff ranges...
At any rate, this is working in DirectX but not in OpenGL:
Shader "Sprites/AlphaCutoff"
{
Properties
{
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_Alpha ("Texture", 2D) = "white" {}
_Color ("Tint", Color) = (1,1,1,1)
[MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
_CutOff ("Cutoff", Range (0, 1)) = 0.5
}
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
}
Cull Off
Lighting Off
ZWrite Off
Fog { Mode Off }
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile DUMMY PIXELSNAP_ON
#include "UnityCG.cginc"
struct appdata_t
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
half2 texcoord : TEXCOORD0;
};
fixed4 _Color;
fixed _CutOff;
v2f vert(appdata_t IN)
{
v2f OUT;
OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
OUT.texcoord = IN.texcoord;
OUT.color = IN.color * _Color;
#ifdef PIXELSNAP_ON
OUT.vertex = UnityPixelSnap (OUT.vertex);
#endif
return OUT;
}
sampler2D _MainTex;
sampler2D _Alpha;
fixed4 frag(v2f IN) : COLOR
{
fixed4 pix = tex2D(_Alpha, IN.texcoord);
if (pix.r > _CutOff) {
return tex2D(_MainTex, IN.texcoord) * IN.color;
} else {
return 0;
}
}
ENDCG
}
}
}
0 isn't a valid vec4. Try returning fixed4(0,0,0,0); You should be able to use fixed4(0) but then you'll get warnings about stupid platforms not being able to compile that.