原理比较简单,传值,根据向量距离修改透明度。不赘述啦。
Shader
"AnimalClamp/GrassTransByVertex"
{
Properties
{
_MainTex (
"Texture"
, 2D) =
"white"
{}
_MainTex_Alpha(
"(A)"
, 2D) =
"white"
{}
_Brightness(
"Brightness"
, range(0, 5)) = 1
_AlphaCutoff(
"Alpha Cutoff"
,range(0, 1)) = 1
_AlphaDistance(
"Alpha Distance 控制范围"
,range(0, 20)) = 1
_AlphaRange(
"Alpha Range 幅度"
,range(0, 1)) = 1
_AlphaMinCtrl(
"Alpha Min Ctrl 整体最小值"
,range(0, 1)) = 1
_AlphaMaxCtrl(
"Alpha Max Ctrl 整体最大值"
,range(0, 1)) = 1
[HideInInspector]_MainPlayerPos(
"Main Player Pos"
,color) = (1,1,1,0)
}
SubShader
{
Tags{
"Queue"
=
"Transparent"
"RenderType"
=
"Opaque"
}
Pass
{
ZWrite On
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma
vertex vert
#pragma
fragment frag
#pragma
target 2.0
#include
"UnityCG.cginc"
//#include "AutoLight.cginc"
struct
appdata
{
float4
vertex : POSITION;
float3
normal : NORMAL;
float4
tangent : TANGENT;
float2
uv : TEXCOORD0;
};
struct
v2f
{
float4
pos : SV_POSITION;
float2
uv : TEXCOORD0;
float
alpha : TEXCOORD1;
};
float
_Brightness;
sampler2D
_MainTex;
sampler2D
_MainTex_Alpha;
float
_AlphaCutoff;
//cutoff
float
_AlphaDistance;
//alpha 控制的距离
float
_AlphaRange;
//alpha幅度
float
_AlphaMinCtrl;
//alpha 整体最小值
float
_AlphaMaxCtrl;
//alpha 整体最大值
float4
_MainPlayerPos;
half4
tex2D_ETC1(
sampler2D
tex,
sampler2D
alpha,
half2
uv)
//3
{
half4
final = tex2D(tex, uv);
final.a = min(1, tex2D(alpha, uv).r);
return
final;
}
v2f vert (appdata v)
{
v2f o;
float3
objVertex = mul(unity_ObjectToWorld, v.vertex).xyz;
//先将顶点转换到世界空间
float3
vertexVec = _MainPlayerPos.xyz - objVertex.xyz;
//pos到顶点的方向向量
float
distance = sqrt(vertexVec.x * vertexVec.x + vertexVec.z * vertexVec.z);
//距离因子,只控制了x & z,如果需要可以把 y 写进去 + vertexVec.y * vertexVec.y
o.alpha = distance;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return
o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D_ETC1(_MainTex, _MainTex_Alpha, i.uv) ;
col.rgb *= _Brightness;
clip(col.a - _AlphaCutoff);
col.a = clamp(i.alpha / _AlphaDistance - _AlphaRange, _AlphaMinCtrl, _AlphaMaxCtrl);
//_AlphaCtrl;//
return
col;
}
ENDCG
}
}
//FallBack "Diffuse" //半透明不要打开,因为FallBack中会绘制阴影
}