fwalker 发表于 2021-12-14 13:45

自定义Unity Terrain材质来刷草-Part 1

最近一段时间一直独立在做钓鱼游戏,我脑海中的钓鱼环境应该是在环境优美的野外,有花有草有树也有清澈的湖水。
       游戏是基于Unity来制作的,Unity引擎提供了基础的terrain工具,可以制作地形,在上面刷树刷草。对于树,Unity是支持带LOD的Prefab,不同距离显示不同细节的模型,效果还不错。对于草,Unity支持两种方式来刷草,一种是Add Grass Texture,一种是Add Detail Mesh。第一种实际上就是放一张图片,可以支持billboard,目的是营造一片草的错觉,这个只能远看,但是离得近,就穿帮了,尤其是在俯视的情况下,如下图。


      第二种是Add Detail Mesh,类似刷树,但是不支持LOD。
      而我心中想要草的效果是类似塞尔达荒野之息中的草,是动态的,满山遍野的。


       塞尔达中的草我不太相信它是手动来刷出来的,手动刷很容易导致密度分布不均,另外这种级别的大世界,工作量也太大了。
       在网上查了一些资料,是有介绍如何制作塞尔达中的草,下面是我参考的一些文章和视频。
       上面的实现方案都是基于Geometry Shader(需要SM 4.0支持)来生成草的网格,并且通过Tessellation Shader(需要SM 4.6支持)生成草的位置,可以达到下面图中的效果。


       现在如何制作草的问题解决了,但是怎么将它刷到场景中呢?其中daniel ilett即第一个视频的作者,提供一个解决方案,通过一张单通道的图来判断哪些地方需要刷草,哪些地方不需要。


       刷出来的效果如下


      源码可以从作者的Github中获取
       第二个解决方案是Minions Art制作的Geometry Shader Grass Tool, 这个工具的原理是记录鼠标的位置,并且在鼠标位置的附近生成草,不过这个对位置的数量是限制的,如果在大的场景中使用这个工具,恐怕运行效率会很糟糕。



      上面两种刷草方案都是由局限性的,第一种方案需要单独提供一张Grass Visibility Map,这张图如何有效的制作是一个问题,第二种方案是记录草的位置,但是这个数据量是有限制的。
       如果我既不手动画一张Visibility Map,也不手动记录草的位置信息,有没有办法在大的地形场景中有效率的刷草呢?要知后事如何,那么请看下文分解。
页: [1]
查看完整版本: 自定义Unity Terrain材质来刷草-Part 1