草的交互及燃烧效果模拟

发表于2017-09-15
评论12 8.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如下:

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

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


草被烧着了

草被燃烧的火球烧着了


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


 

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