草的交互及燃烧效果模拟

发表于2017-09-15
评论12 9.9k浏览

草的交互及燃烧效果模拟

 

草的交互

草的交互应该算比较传统的技术了,之前在我的网站评论里下面有人问过(用多说多说下架,用网易云跟帖网易云跟帖下架。。允悲),想着还是写一些思路。

对于草的摆动来说其实很简单,就是用过uv或者顶点颜色来标记草的摆动幅度,比如根部摆动小,顶部摆动大,然后通过这些数据来进行顶点偏移达到草摆动的效果。伪码如下:

vertex shader :

v.vertex.x  = 根部顶部标记 * 振幅 * cos(_Time.y * 频率 相位);

v.vertex.z 类似

 

扰动的话,无非就是通过脚本动态传入被扰动的数据,一般来说,有两种方案。

第一,遍历所有的草的顶点,然后通过比较顶点与草的距离,然后把参数存入顶点颜色里。

vertex shader :

v.vertex.x = 根部顶部标记 * 振幅 * cos(_Time.y * 频率 相位) v.color.b * 扰动振幅 * cos(_Time.y * 扰动频率) * 扰动的变化量;

v.vertex.z 类似

但是这样当草的数量多的时候开销会非常大,这样就有第二种优化方案,就是将人物的移动写到贴图里,然后在vertex shader里通过texlod获取,但这需要opengles3.0以上,不过以现在来看,现在手机不支持3.0的已经挺少了,可以忽略,无非做一个宏来开启。

最后类似于:

float4 obstacleColor = tex2Dlod(_GrassShader_ObstacleTex, float4(v.texcoord1.xy, 0, 0));

其中v.texcoord1.xy是当前顶点在人物扰动图中的uv,这个通过建模转化很容易就不多说了。

演示底层颜色使用的gif如下:

 我用蓝色来标记草的根部与顶部,绿色用来做随机(这样不至于所有的草都一样),红色用来做扰动的变量

燃烧的话,是看到荒野之息的烧草觉得还挺有意思的,就尝试加了一下,其实技术也挺简单,就是溶解效果就可以了,也是通过扰动变化量来控制。


草被烧着了

草被燃烧的火球烧着了


看到这的都是真爱,更多文章请访问我的网站 徐小厨 


 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

12个评论

  • 小黑姑娘 2017-09-15 1楼
  • 当时年少 2017-09-15 2楼
    太 太 太帅~\(≧▽≦)/~啦啦啦
  • heather 2017-09-15 3楼
    很赞~先收藏下来做参考
  • Tiny 2019-08-09 4楼
    草多了不卡才怪
  • 卤蛋吃卤蛋 2017-09-19 5楼
    不简单
  • 挖毒游民 2017-09-19 6楼
    刷一波666
  • 邻家小木头 2017-09-25 7楼
    666
  • ... 2017-09-30 8楼
    代码咧?哥
  • 007 2017-10-09 9楼
    太 太 太帅~\(≧▽≦)/~啦啦啦
  • primatic+labbit 2017-10-28 10楼
    关于草交互的 up主用的 unity的地形草 还是单独的 gameobject 有没有详细的教程 或者文章 链接 。。。shader新手 希望能找一个可以运行的demo 不然就是储备知识了..
  • 侠茶坐 2019-08-09 11楼
    大佬 强 我要自己实现下
  • 叶维 2020-03-28 12楼
    大佬能分享一下源码吗