Unity3D:大世界草海(1)
会陆陆续续分享一些大世界制作中的一些技术,如果有错误或者更好的解决方案请告知草对世界的真实性又很大提升,不会显得那么空旷,同时还能添加一些交互上的效果,比如塞尔达的割草,烧草,踩踏,风力等等,添加世界的丰富度,让世界显得更真实
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的网格交互,燃烧,以及割草,风力。
页:
[1]