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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值