小boss让我写个shader加到sprite上,然后发现了一个神奇的问题,
Sprite的vertex在哪?现在考虑一种Sprite,它的内容没有占满整个
sprite的rect(就是你能拖动的rect),其他地方是透明的。这种sprite
的顶点既不是rect的四个顶点,也不在图像内容的边界上,而是系统
自动生成的一个多边形,这个多边形比图像内容大,把图像内容包括
在其中。
那么我现在想弄一个效果,原sprite的背后弄个影子,对于新创建的
sprite,他的shader是内置的。只能自己新建一个material,然后把做
sprite的png图像拖到material的tex里。
主要是怎么排除多边形内部的透明部分,其实就是用 Blend One One让
该部分与当前屏幕的颜色混合就行,具体看代码。另外我又发现一个问题,
可能是个偶然会出现的bug还是什么,两个自定义的shader内容完全一致(除了
文件名字和第一行的shader“XXX”),竟然有一个会得出异常结果。
Shader "Custom/Fragment extend" {
Properties {
_Color ("Surround Color", Color) = (0.2,0.2,0.2,0.7)
_MainTex ("Base (RGB)", 2D) = "white" {}
_Range("Range",Range(0.1,0.3)) = 0.15
//_Range2("Range",Range(0.1,10))=0.5
}
SubShader {
//Tags{"RenderType"="Transparent"}
//Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
LOD 100
Pass{
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float _Range;
sampler2D _MainTex;
float _Range2;
float4 _Color;
struct appdata_t
{
float4 vertex : POSITION;
//half4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : POSITION;
//half4 color : COLOR;
float2 texcoord : TEXCOORD0;
//float2 worldPos : TEXCOORD1;
};
v2f vert (appdata_t v)
{
v2f o;
v.vertex.xyz+=_Range*v.vertex.xyz;
//v.vertex.xy+=_Range2;
o.vertex = mul(UNITY_MATRIX_MVP,v.vertex);
//o.texcoord=TRANSFORM_TEX(v.texcoord,_MainTex);
o.texcoord=v.texcoord;
return o;
}
half4 frag (v2f IN) : COLOR
{
half4 I=tex2D(_MainTex,IN.texcoord);
if(I.a<0.4)
{
I.rgb=0f;
I.a=0f;
}
else
I.rgb*=_Color.rgb;
return I;
}
ENDCG
}
Pass{
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float _Range;
sampler2D _MainTex;
float4 _Color;
struct appdata_t
{
float4 vertex : POSITION;
//half4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : POSITION;
//half4 color : COLOR;
float2 texcoord : TEXCOORD0;
//float2 worldPos : TEXCOORD1;
};
v2f vert (appdata_t v)
{
v2f o;
//v.vertex.xyz+=_Range*v.vertex.xyz;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
//o.texcoord=TRANSFORM_TEX(v.texcoord,_MainTex);
o.texcoord=v.texcoord;
return o;
}
half4 frag (v2f IN) : COLOR
{
half4 I=tex2D(_MainTex,IN.texcoord);
if(I.a<0.4)
{
// I.rgb=0;
// I.a=0;
I=0;
//I.rgba=0;
}
return I;
}
ENDCG
}
//Pass{
// Tags{"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
// Blend One Zero
// SetTexture [_MainTex]
// {
// Combine Texture
// }
//}
// third part
}
FallBack "VertexLit"
}