其实基本原理就是将主角的位置传进shader的_MainPlayerPos,然后根据顶点和人物的位置进行相减求出方向向量,然后进行一个位置的偏移。
但是这种效果的开销是蛮大的,如果是对一整片草(一个obj)进行传值,并且只是进入一定范围才会进行传值,效果还是可以接受的。不过再怎么也没有美术的动画看起来真实,但是美术的动画不会针对一片草进行动画啦。可以配合在一起用,效果是不错的。
Shader "AnimalClamp/GrassMoveByVertex"     //人物走过的草丛,自动出现被踩踏的效果
{
       Properties
       {
              _MainTex ( "Texture" , 2D) = "white" {}
              _MainTex_Alpha( "(A)" , 2D) = "white" {}
              _Brightness( "Brightness" , range(0, 5)) = 1
              _AlphaCutoff( "Alpha Cutoff" ,range(0, 1)) = 1
              _RefluenceDistance( "Refluence Distance" , float ) = 1            //受影响的上限范围,大于该值等于0,就不再受影响了
              _RefluenceArgs( "Refluence Args" ,range(0,10)) = 0               //影响的参数,即最终的一个范围值的上限
              _BlugeShape( "Bluge Shape" , float ) = 5
              _BlugeScale( "Bluge Scale" , float ) = 5
              _BlugeSquare( "Bluge Square" , float ) = 5                               //影响范围的参数
              [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"
                      struct appdata
                     {
                            float4 vertex : POSITION;
                            float3 normal : NORMAL;
                            float4 tangent : TANGENT;
                            float2 uv : TEXCOORD0;
                     };
                      struct v2f
                     {
                            float4 pos : SV_POSITION;
                            float2 uv : TEXCOORD0;
                            float3 square : TEXCOORD1;  //娱乐,写着玩的
                     };
                      float _Brightness;
                      sampler2D _MainTex;
                      sampler2D _MainTex_Alpha;
                      float _AlphaCutoff;
                      float4 _MainPlayerPos;
                      float _RefluenceDistance;
                      float _RefluenceArgs;
                      float _BlugeShape;
                      float _BlugeScale;
                      float _BlugeSquare;
                      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;                                   
                           o.uv = v.uv;
                            float3 objVertex = mul(unity_ObjectToWorld, v.vertex).xyz; //先将顶点转换到世界空间
                            float3 vertexVec = objVertex.xyz - _MainPlayerPos.xyz; //pos到顶点的方向向量
                            float distance = sqrt(vertexVec.x * vertexVec.x + vertexVec.z * vertexVec.z); //距离因子,只控制了x & z,如果需要可以把 y 写进去                      + vertexVec.y * vertexVec.y
                            float3 moveArgs = 1 / distance * _BlugeSquare * vertexVec;     //顶点偏移的参数,没有错的
                           o.square = moveArgs;
                            float3 moveOffset = moveArgs; // *objVertex.xyz * normalize(vertexVec);//(abs(distance) > _RefluenceDistance ? 0 :
                            float3 offset = pow((abs((frac((o.uv + _Time.g * float2 (0.25, 0)).r) - 0.5)) * 2), _BlugeShape) * v.normal * _BlugeScale;//草循坏摆动的经验公式
                           offset += clamp(moveArgs, -1, 1) ;//加上被压的offset,把这个值规定到-1到1,以免显示夸张
                           //这里的offset偏移量是依据复制出来的世界空间的顶点信息做得 objVertex ,包括空间坐标系转换都是用 vertexVec ,而不可以直接用v.vertex,因为如果用 v.vertex 迭代的话,会出现一定距离的误差,这是一个深坑,不知道为什么的深坑
                           offset = mul(unity_WorldToObject, offset);
                           o.pos = UnityObjectToClipPos(v.vertex + offset); //+ vertexVec * distance 好玩的效果
                            return o;
                     }
                     
                     fixed4 frag (v2f i) : SV_Target
                     {
                           fixed4 col = tex2D_ETC1(_MainTex, _MainTex_Alpha, i.uv) ;
                           col.rgb *= _Brightness;
                           clip(col.a - _AlphaCutoff);
                            return col * float4 (i.square, 1);
                     }
                     ENDCG
              }
       }
        //FallBack "Diffuse" //半透明不要打开,因为FallBack中会绘制阴影
}

人物走过的草丛,自动出现被踩踏的效果相关推荐

  1. Android 获取短信验证码并自动填充(踩坑小米、荣耀、OPPO、华为)

    Android 获取短信验证码并自动填充(踩坑小米.荣耀.OPPO) 前言 最近弄了个短信自动填充功能,一开始觉得很简单,不就是动态注册个广播接收器去监听短信消息不就可以了吗?结果没这么简单,问题就出 ...

  2. 【解决方案】文化体育场馆如何搭建远程网络视频监控,防范突发人流拥挤踩踏事件?

    一.建设背景 文体馆的安全建设和发展是对人民群众和参观游客的人身安全负责的首要责任.场馆的游客聚集流入以及中小学生等青少年群体的集中参观,同时鉴于频繁发生的场馆人流聚集拥挤和踩踏事件,安全防范系统的建 ...

  3. 加油站踩踏式逃亡?电网成大赢家?时代抛弃你的时候,真的一声不吭

    电力网按: 时代抛弃你的时候,真的一声不吭!新能源汽车的渗透率远超想象,在电子游戏.移动互联网.短视频时代成长起来的Z世代,没有接受过燃油车时代的恩惠,对电动车天然接受程度高,这部分人群即将或者已经成 ...

  4. 如何在踩踏事故中幸存以及如何避免踩踏事故发生

    一月一日只是普通的一天. 很遗憾的是,在这普通的一天的清晨,我要写下这样一段文字. 踩踏,是一种极其原始的事故.每年东非大迁徙的过程中都有很多食草动物死于同类的蹄子之下.而人群的踩踏事故更是在史书上画 ...

  5. 为特斯拉车主构思设计的一款刹车踩踏数据监测器

    最近特斯拉刹车失灵事件闹得沸沸扬扬,一位女车主驾驶特斯拉汽车发生交通事故,车主以刹车失灵为由对特斯拉进行两个月的维权,而在"闹剧"发酵到顶峰后,特斯拉才提供了车辆发生事故前一分钟的 ...

  6. android首页图片轮播效果,Android_Android自动播放Banner图片轮播效果,先看一下效果图支持本地图 - phpStudy...

    Android自动播放Banner图片轮播效果 先看一下效果图 支持本地图片以及网络图片or本地网络混合. 使用方式: android:id="@+id/banner" andro ...

  7. [USACO15JAN]踩踏Stampede

    [USACO15JAN]踩踏Stampede 题目描述 DJ站在原点上向y轴正半轴看,然后有一群奶牛从他眼前飞过.这些奶牛初始都在第二象限,尾巴在(Xi,Yi),头在(Xi+1,Yi),每Ci秒向右走 ...

  8. 活久见!一美国大爷发明了永不掉链子的自行车,垂直踩踏即可驱动

    全世界只有3.14 % 的人关注了 爆炸吧知识 ©文丨 直观学机械.自行车网 最近,一款能永不掉链子的自行车特别火,咱们今天来看看它长什么样. 这款自行车据说是由美国洛杉矶的一位老大爷 Rodger ...

  9. iphone app 的图标上被自动添加一层半透明遮罩(玻璃效果),小米3这样的高分屏icon不生效,怎么破?

    ios/info.plist 添加一行: Icon already includes gloss effects = YES 意思就是告诉苹果我提供的图标已经自带玻璃效果了,不用你添加一层遮罩了! 有 ...

最新文章

  1. java clob内存溢出_java - java.sql.SQLException:ORA-01704:字符串文字太长时插入或更新 - 堆栈内存溢出...
  2. 【深度学习】深度学习模型训练全流程!
  3. SparkSQL操作Hive
  4. Observer观察者设计模式
  5. OpenCASCADE:形状愈合之根据指定标准分割形状的工具
  6. 关于mysql的wait_timeout参数 设置不生效的问题
  7. 2018中国C++大会精彩回顾
  8. hbase删除表失败的解决方法
  9. .net core+Spring Cloud学习之路 一
  10. 沣东新城镐京遗址规划_沣东新城房价为啥这么高?
  11. DIY购车入门5步法则
  12. 微信小程序使用Echarts 实现世界地图(其它地图同理)
  13. 什么软件可以测试家里的宽带,技术贴 | 如何简单又专业的测试自己家的网速是否达标...
  14. 产品如何取得WFA的WiFi认证(二)成为WFA会员
  15. adobe 奥多比bridge extention等产品 “安装程序无法初始化。请下载Adobe Support Advisor检测该问题”
  16. swagger2接口文档
  17. Problem B – Buggy ICPC——思维,找规律
  18. 何去何从?——从性能测试到全栈测试的思考
  19. 医院陪护小程序,专业的事情交给专业的人
  20. mongoDB使用数据(数据的插入,查询等介绍)

热门文章

  1. Linux下修改消息队列大小
  2. 【数据压缩3】AVI文件格式分析及问题回答+WAV文件格式分析
  3. yEd Graph Editor 操作指南
  4. 前搜狗搜索技术负责人郭昂指出:大多数重构可以避免
  5. 数组和链表的区别,各有何优缺点
  6. 深度理解onmouseover事件和onmouseout事件
  7. 做到“有效沟通”,帮你达到这3个目的
  8. 第134章 SQL函数 STUFF
  9. 如何将pdf图片文字转换成word 文字word图片怎么转换pdf
  10. PHP合并数组几种方式总结及数组去重