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

Unity3D:大世界草海(1)

[复制链接]
发表于 2022-5-10 18:23 | 显示全部楼层 |阅读模式
会陆陆续续分享一些大世界制作中的一些技术,如果有错误或者更好的解决方案请告知
草对世界的真实性又很大提升,不会显得那么空旷,同时还能添加一些交互上的效果,比如塞尔达的割草,烧草,踩踏,风力等等,添加世界的丰富度,让世界显得更真实
unity的原生terrain使用的Detail Map来存储草,这带来了哪些问题

  • 世界是三维的,可能同一个位置 在山谷下有草 同时在正上方石块上也有草,二维的图不能表示这样的信息
  • 如果石块上也长草呢?又需要新开一套方案
同时草也是有一定视距的,那么就可以使用一套基于格子的方法,按照草的视距去加载玩家N下N范围内的格子,每个格子都记录下每一类草 所有的坐标,缩放,旋转,还需要做好数据压缩,比如旋转只需要记录Y轴旋转就够了,scale也只需要记录一个统一值,另外还可以使用byte类型进一步压缩。运行时,当玩家跨草格子时,才去重新刷新草的格子,收集所有格子全部草的位置信息,在运行时将周围一圈草的信息进行粗剔除后,统一直接使用DrawMeshInstanced或者DrawMeshInstancedIndirect进行批量绘制,可以根据SSBO选择对应策略。获得位置信息再进行绘制就很容易。现在只需要收集场景内的全部草的信息,在进行数据分块存储。
那么如何提供给美术人员进行场景编辑呢?
一开始是直接使用Prefab Painter之类的工具,把带LODGroup的草直接刷进场景,然后收集所有草的信息在进行数据分块,因为草的数量是非常巨大的,刷上数十万的草之后 在编辑器下也很卡了,另外做草的删除也非常困难,编辑器下难以选中删除。因为这一类插件原先设计是给石头之类的物件使用的,数量原没有这么大。
那么在这个时候 一套特制的刷草工具就非常重要了,需要再编辑器下也使用DrawMeshInstanced技术,确保编辑器下预览不卡,同时能够便于修改。还能需要的物体上也能绘制草。在编辑器下创建一个GrassDBSO,收集刷出来的全部草,再大世界下也做四叉树管理,为了删除不卡,还需要对数据进行格子划分,减少单个格子草的数量。再烘焙数据时,再直接解析这个Grass DBSO,拆分成格子。


https://www.zhihu.com/video/1505994293591957504
刷草过程中不需要再创建物体了,就只需要记录位置信息就够了,直接提交绘制。


https://www.zhihu.com/video/1505999984168595456

为了节省时间,也基于地形splatmap做了一套自动生成草的机制,比如只有草地地表自动生成植被,减少美术工作量。
下篇再讲讲如何做草的交互,包括基于Mesh的网格交互,燃烧,以及割草,风力。

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-5-10 05:33 , Processed in 0.092324 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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