一直在思考怎么让场景更有生机,我觉得植被的随风摆动是必不可少的.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. JMeter怎样测试WebSocket

    一.安装WebSocket取样器 1.从JMeter插件管理器官网下载: https://jmeter-plugins.org/ 把这6个jar包放到C:\JMeter\apache-jmeter-3 ...

  2. 配置文件语言之yaml

    一. Yaml YAML 是一种简洁的非标记语言.YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读. 由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用.列一下现 ...

  3. Javascript 初学笔记

    变量作用域 自 ES2015 起,JS 引入let 和 const 关键词定义变量的块作用域(Block Scope). var 仅支持全局作用域(Global Scope)和函数作用域(Functi ...

  4. Paper Reading - Convolutional Sequence to Sequence Learning ( CoRR 2017 ) ★

    Link of the Paper: https://arxiv.org/abs/1705.03122 Motivation: Compared to recurrent layers, convol ...

  5. python2和python3同时存在如何安装和使用pip

    linux下 如果没有pip则需要安装pip python2安装pip sudo apt install python-pip1如果是python3,则如下: sudo apt install pyt ...

  6. ssd a

    Alpha版本测试报告 (1)测试计划 测试人员 工作安排 瞿煌人 制定测试计划,撰写测试报告 周建峰 执行测试,撰写测试报告 注:测试结果Y表示通过测试,N表示未通过测试. 功能 描述 效果 测试结 ...

  7. c# WPS DLL及其调用

    1.dll分享(含xsl及docx的dll) 链接:https://pan.baidu.com/s/1c1ImV14OndmvIb4W-_WL2A 密码:d2rx 2.方法: 1.先在类的前面(类外面 ...

  8. “我爱淘”第二冲刺阶段Scrum站立会议6

    完成任务: 完成学院分类的点击查看书籍功能,可以点击书的条目查看书的详细信息. 计划任务: 将书的详细信息进行完善,并且可以点击收藏以及已预订等功能. 遇到问题: 分类功能,根据不同学院,自动将数据库 ...

  9. 2014-2015 ACM-ICPC, NEERC, Eastern Subregional Contest Problem G. The Debut Album

    题目来源:http://codeforces.com/group/aUVPeyEnI2/contest/229669 时间限制:1s 空间限制:64MB 题目大意:给定n,a,b的值 求一个长度为n的 ...

  10. lintcode-445-余弦相似度

    445-余弦相似度 Cosine similarity is a measure of similarity between two vectors of an inner product space ...