找回密码
 立即注册
查看: 653|回复: 0

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

[复制链接]
发表于 2021-12-14 13:45 | 显示全部楼层 |阅读模式
最近一段时间一直独立在做钓鱼游戏,我脑海中的钓鱼环境应该是在环境优美的野外,有花有草有树也有清澈的湖水。
       游戏是基于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,也不手动记录草的位置信息,有没有办法在大的地形场景中有效率的刷草呢?要知后事如何,那么请看下文分解。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-23 01:24 , Processed in 0.111461 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表