sprite实现影子

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/

游戏是由人创造出来的,你如果能够为开发人员提供高质量的工具,并帮助他们更好地完成自己的工作,包括帮助他们提高生产力、尝试新事物并进行实验,那么你就越有可能在这个行业中获得成功。
原文地址:https://www.cnblogs.com/rxs123/p/7683697.html