草的交互及燃烧效果模拟
草的交互及燃烧效果模拟
草
草的交互
草的交互应该算比较传统的技术了,之前在我的网站评论里下面有人问过(用多说多说下架,用网易云跟帖网易云跟帖下架。。允悲),想着还是写一些思路。
对于草的摆动来说其实很简单,就是用过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如下:
我用蓝色来标记草的根部与顶部,绿色用来做随机(这样不至于所有的草都一样),红色用来做扰动的变量
燃烧的话,是看到荒野之息的烧草觉得还挺有意思的,就尝试加了一下,其实技术也挺简单,就是溶解效果就可以了,也是通过扰动变化量来控制。
草被烧着了
草被燃烧的火球烧着了
看到这的都是真爱,更多文章请访问我的网站 徐小厨