以主角为起点,周围的草根据位置透明显示

原理比较简单,传值,根据向量距离修改透明度。不赘述啦。

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中会绘制阴影
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值