一直在思考怎么让场景更有生机,我觉得植被的随风摆动是必不可少的.CE3引擎的植被bending就做得特别棒.我也准备在手机上做一套.

先分析一下植被摆动常见的几种做法.其实不管哪种做法,核心就是让植被顶点做动画,有的顶点动的少(比如树根),有的顶点动的多(比如树顶),根据怎么样的权重来动?

方案1:  用UV来做权重.

这种方案对UV展开有要求,要从0到1,只适合面片草,这样的话草的根部和顶部的摆动权重就是一个0到1的线性的变化,随便用一个正玄波就能实现简单摆动了,

  1. // 根据UV实现简单的顶点动画
  2. float4 newPos = v.vertex;
  3. newPos.xyz += _Wind_Simple.xyz * v.texcoord.y * _BendingFactor;

方案2: 用顶点和模型原点的距离来做权重.

CE3的Main Bending就是这种方案.顶点到模型原点的距离,其实就是模型的顶点值,再用这个值除以包围盒的参数,就能得到每个顶点0到1的摆动权重,很简单是吧,这种方案对UV就没要求,适合所有植被,但是,这种方案不能用于合批,比如Unity自带的静态合批,因为合批以后,模型其实已经变了,顶点到原点的距离也已经变了.

方案3:用顶点颜色来做权重

CE3的Detail Bending就是此方案.让美术刷顶点颜色,来作为摆动权重,顶点颜色有几个通道,每个通道实现一种频率的摆动,这样就可以实现比较复杂的摆动,比如Blue通道用来处理主干的摆动,Red通道处理树枝的摆动,Green通道用来处理树叶的细节抖动.这种方案好处是,不受UV和合批的影响,适合任何植被,而且还可以实现比较复杂的细节抖动,让抖动更真实.麻烦的就是要教会美术刷顶点色,而且效率开销最大.

此方案应该是最完美的植被摆动方案,GPU GEM3对此有详细分析:

点击打开链接

结合项目实际情况,我的整体方案如下:

1.草用第一种,效率比较高

2.树木和旗子用第三种,控制使用,而且尽量减少这种模型的顶点数量,

全局风控制,

摆动的幅度还应该受风影响:

草的话用一种风,树木的话单独用一种风.

    1. [ExecuteInEditMode]
    2. public class VegetationWind : MonoBehaviour
    3. {
    4. public Vector4 Wind = new Vector4(0.85f, 0.075f, 0.4f, 0.5f);
    5. public float WindFrequency = 0.75f;
    6. private float WaveFrequency = 4.0f;
    7. private float WaveAmplitude = 0.1f;
    8. void Start()
    9. {
    10. Shader.SetGlobalVector("_Wind_VertexColor", Wind);
    11. Shader.SetGlobalVector("_Wind_Simple", Wind);
    12. }
    13. void Update()
    14. {
    15. // wind 1
    16. Vector4 Wind1 = Wind * ((Mathf.Sin(Time.realtimeSinceStartup * WindFrequency)));
    17. Wind1.w = Wind.w;
    18. // wind 2q
    19. //Vector4 Wind2 = Wind1 * Wind1.w;
    20. Vector4 Wind2 = new Vector4();
    21. Wind2.x += Mathf.Sin(Time.realtimeSinceStartup * WaveFrequency) * WaveAmplitude;
    22. Wind2.y = 0;
    23. Wind2.z += Mathf.Sin(Time.realtimeSinceStartup * WaveFrequency + Mathf.PI * 0.5f) * WaveAmplitude;
    24. Wind2.w = 0;
    25. Shader.SetGlobalVector("_Wind_VertexColor", Wind1);
    26. Shader.SetGlobalVector("_Wind_Simple", Wind2);
    27. }
    28. }

Unity3D手游开发日记(5) - 适合移动平台的植被随风摆动的更多相关文章

  1. Unity3D手游开发日记(6) - 适合移动平台的水深处理

    市面上大部分的手机游戏,水面都比较粗糙,也基本没发现谁做过水深的处理. 水深的处理在PC平台比较容易,因为很容易获得每个像素的深度,比如G-Buffer,有了像素的深度,就能计算出每个像素到水面的距离 ...

  2. Unity3D手游开发日记(4) - 适合移动平台的热浪扭曲

    热浪扭曲效果的实现,分两部分,一是抓图,二是扭曲扰动.其中难点在于抓图的处理,网上的解决方案有两种,在移动平台都有很多问题,只好自己实现了一种新的方案,效果还不错. 网上方案1. 用GrabPass抓 ...

  3. Unity3D手游开发日记(7) - 适合移动平台的天气效果

    腾讯的天涯明月刀的天气很棒,以前我也在CE3的基础上做了一个效果差不多的,但是在手机上,还是斜下固定视角的游戏,是否还需要一个天气系统? 而且没有G-Buffer的支持,很多牛逼效果实现不了,比如角色 ...

  4. Unity3D手游开发日记(9) - 互动草的效果

    所谓互动草,就是角色跑动或者释放技能,能影响草的摆动方向和幅度. 前面的文章早已经实现了风吹草动的效果,迟迟没有在Unity上面做互动草,是因为以前我在端游项目做过一套太过于牛逼的方案.在CE3的互动 ...

  5. Unity3D手游开发日记(8) - 运动残影效果

    2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理. 实现原理也很简单: 1.间隔一定时间创建一个残影模型 GameObject go = Gam ...

  6. Unity3D手游开发日记(2) - 技能系统架构设计

    我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10 ...

  7. Unity3D手游开发日记(3) - 场景加载进度条的完美方案

    我以为做个进度条很简单,分分钟解决,结果折腾了一天才搞定,Unity有很多坑,要做完美需要逐一解决. 问题1:最简单的方法不能实现100%的进度 用最简单的方法来实现,不能实现100%的进度,原因是U ...

  8. Unity3D手游开发日记(1) - 移动平台实时阴影方案

    阴影这个东西,说来就话长了,很多年前人们就开始研究出各种阴影技术,但都存在各种瑕疵和问题,直到近几年出现了PSSM,也就是CE3的CSM,阴影技术才算有个比较完美的解决方案.Unity自带的实时阴影, ...

  9. Unity3D手游开发实践

    <腾讯桌球:客户端总结> 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身.虽然基于Unity3D,很多东西同样适用于Cocos.本文从以下10大点进行阐述: 架构设计 原生插件/ ...

随机推荐

  1. POJ 3278 Catch That Cow (附有Runtime Error和Wrong Answer的常见原因)

    题目链接:http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total S ...

  2. Windows10 Oracle ODBC安装配置

    项目紧迫,需在短时间内交付成果,新团队成员,吐嘈之前数据库设计太low,很难看懂数据库表结构间的关系,为了使新同事更好的了解数据库表结构,特意使用powerDesigner对oracle.mysql数 ...

  3. Python如何判断变量的类型

    Python判断变量的类型有两种方法:type() 和 isinstance() 如何使用 对于基本的数据类型两个的效果都一样 type() ip_port = ['219.135.164.245', ...

  4. 用Python爬下今日头条所有美女,美滋滋!

      我们的学习爬虫的动力是什么? 有人可能会说:如果我学好了,我可以找一个高薪的工作. 有人可能会说:我学习编程希望能够为社会做贡献(手动滑稽) 有人可能会说:为了妹子! ..... 其实我们会发现妹 ...

  5. Throwable、Error、Exception、RuntimeException的区别与联系

    Throwable类是Java语言中所有错误和异常的超类.只有作为此类(或其子类之一)的实例的对象才被Java虚拟机抛出,或者可以被Java throw语句抛出.类似地,只有这个类或其子类之一可以是c ...

  6. 基于 Agent 的模型入门:Python 实现隔离仿真

    2005 年诺贝尔经济学奖得主托马斯·谢林(Thomas Schelling)在上世纪 70 年代就纽约的人种居住分布得出了著名的 Schelling segregation model,这是一个 A ...

  7. WIN 7 发布项目

    本人工作都快两年了不知道web 怎么发布 今天我自己非常恼火!我就暗暗研究.希望能给新手指导 准备工作:WIN7 系统 .IIS 6.0.MVC (vs 新建mvc项目自带的项目) OK begin ...

  8. Beta发布—美工+文案

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2408 视频展示地址:https://www.bilibili.com/v ...

  9. 【每日scrum】NO.8

    (1) 在图的设计过程中掌握了图的基本运算函数的算法的理解和程序的有效吸收,包括图的深度和广度优先的遍历,对图的联通分量的求解,图的最小生成树,图的拓扑排序,图的关键路径, (2)在迪杰斯特拉算法的基 ...

  10. CodeForces 479C Exams 贪心

    题目: C. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input o ...