2d项目需要实现影子效果,sprite实现效果不理想,为了实现高分辨率的影子,使用shader的一个pass实现影子:这里直接上代码
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// RGB sprite split shader test unitycoder.com
Shader "RXS/SpriteShadow"
{
Properties
{
[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
// _Color ("Tint", Color) = (1,1,1,1)
[MaterialToggle] PixelSnap("Pixel snap", Float) = 0
_RedOffsetX("RedOffsetX", Float) = 0
_RedOffsetY("RedOffsetY", Float) = 0
_GreenOffsetX("GreenOffsetX", Float) = 0
_GreenOffsetY("GreenOffsetY", Float) = 0
_BlueOffsetX("BlueOffsetX", Float) = 0
_BlueOffsetY("BlueOffsetY", Float) = 0
}
SubShader
{
Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
"PreviewType" = "Plane"
"CanUseSpriteAtlas" = "True"
}
Cull Off
Lighting Off
ZWrite Off
Fog{ Mode Off }
// Blend SrcAlpha OneMinusSrcAlpha
// Blend SrcAlpha OneMinusSrcAlpha // Soft Additiv
// shadow
Pass
{
Blend SrcAlpha OneMinusSrcAlpha // Soft Additiv
//Blend One One // Additive
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;
float _BlueOffsetX;
float _BlueOffsetY;
v2f vert(appdata_t IN)
{
v2f OUT;
OUT.vertex = UnityObjectToClipPos(IN.vertex);
OUT.texcoord = IN.texcoord;
// OUT.color = IN.color * _Color;
OUT.color = float4(0,0,0,1);
OUT.vertex.xy += float2(_BlueOffsetX,_BlueOffsetY);
#ifdef PIXELSNAP_ON
OUT.vertex = UnityPixelSnap(OUT.vertex);
#endif
return OUT;
}
sampler2D _MainTex;
fixed4 frag(v2f IN) : COLOR
{
return (tex2D(_MainTex, IN.texcoord) * IN.color)*0.5;//;+float4(1,1,1,0.5);;
}
ENDCG
} // end pass
// texture
Pass
{
//Blend One One
Blend SrcAlpha OneMinusSrcAlpha // Soft Additiv
// Blend One One // Additive
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;
float _RedOffsetX;
float _RedOffsetY;
v2f vert(appdata_t IN)
{
v2f OUT;
OUT.vertex = UnityObjectToClipPos(IN.vertex);
OUT.texcoord = IN.texcoord;
// OUT.color = IN.color * _Color;
OUT.color = IN.color ;
OUT.vertex.xy += float2(_RedOffsetX,_RedOffsetY);
#ifdef PIXELSNAP_ON
OUT.vertex = UnityPixelSnap(OUT.vertex);
#endif
return OUT;
}
sampler2D _MainTex;
fixed4 frag(v2f IN) : COLOR
{
return tex2D(_MainTex, IN.texcoord);// *IN.color;
}
ENDCG
}
}
}
参考网站http://unitycoder.com/blog/2014/01/06/sprite-rgb-split-shader-test/