Terrain 算法整理。基本常识。
Terrain 算法整理。基本常识。
制作地形的方法大致分为 Voxel, Height map, Mesh 这几种,会根据使用的技术有各自的长短处,常识上的长短处如下。Unity 用的是高度图,所以说明下这个方式。
高度图地形的构成大概有4种,内存管理系统最重要也很难。
(1) 用高度图贴图制作的Mesh ( CPU -> 变成 GPU )
(2) Splitting 画出的贴图 ( 跟着 GPU 的发达,算法也在持续发达 )
(3) 内存管理系统 ( Stamp 单一 -> Tiled ,变成很多个 )
(4) 地图上的物体管理系统 ( group LOD )
以前的方式里地形的 Mesh 数据在世界坐标上以网格分 Chunk 管理。 LOD 离镜头越近每 Chunk 的 detail 越高,离镜头越远每Chunk的detail越低。 调 detail 叫做 ROAM 方式, cpu 会把 LOD 等级有变化的 Chunk 的 vertex buffer 和 Index buffer 都进行更新。
Unity 会把一个 Chunk 用四分树预先做好 detail LOD。然后根据 LOD 等级选择画自己还是画预先生成的精致的4个子 Chunk 进行渲染。
因为逻辑方式的问题,受 LOD 影响的 Chunk 每个阶段会增加4倍的Drawcalla。因为会占内存,不适合做大地图。
之后的 GPU 方式算法 geometry clipmaps 是2004年出的,实际上是 dx9 上市后可以从 vertex shader 读取贴图数据后开始使用的。
这个算法跟以前的不一样,不是以世界为中心(World Space) 而是以镜头为中心(Camera Space or View Space )画出预先做好的地形Chunk。高度和法线是在 vertex shader 阶段从贴图读取计算的。
Vertex Buffer的结构是越靠近中心渲染的精致度更高,越远相对越低,因为是镜头为中心的地域坐标(Local coordinate ),所以不需要 Mesh LOD。
现在是在 Unreal landscape,2018年新出的 Unity 新地形系统里使用的。
最后一种方法是使用 Geometry Shader 和 Tessellation ,因为需要 Shader model 5.0 硬件所以没有正式选择的引擎,所以不提取这种方式了。( <= 这基本是 voxel 和 height map 的混合方式)
然后是画在地形上的贴图。
地形跟普通的Mesh不一样,多个贴图根据制作人员做出的权重 Weight 随着 Layer混合,所以没什么可说的。
主要是怎么混合,以前的方式是根据 Weight 乘与 Linear 进行 Blending ,最近是用各种算法加 Weight value 可以更好的混合。
另外,使用 opengl es3.0 和 dx10 添加的 texture2DArray 会管理起来更方便。
以前地形是一个,但是现在地图越来越大还出现了无缝地图,所以用一张图已经驾驭不了。 所以做出了拼接多个地图实时储存加载的功能 Tiled 。
概念上虽然只是拼接,但实际上需要费很大精力管理。
在 Back-end 持续跟着镜头的移动读取和解除进行 LOD 不是一件容易的事情。
2018 将上市的新地形系统上是支持的。
我想说下最重要的一项工作 - 管理地图上的物体。 简单来讲都是 LOD,以组为单位的 LOD 到最下面 Mesh 为单位都需要管理。
但是随着越来越大,要不要渲染,Mesh要用哪个,有没有遮盖,Lightmap是不是烘焙过的,有没有GI信息 等等,从上面说过的可以做 Tiled 的系统开始会非常复杂。
比起 LOD, 把用在 LOD 的各个阶段资源在 back-end level 读取和解除做管理会更难。
为了完成这种工作制作了 Mega texture ,也出现了 Sparse texture ,这方面的工作在持续发展。 这些操作都是用非同步 streaming 读取和解除的。
现在还没有提供一个完美的系统的引擎。
这就意味着这部分都是要制作的;;;
Reference.
https://developer.nvidia.com/gpugems/GPUGems2/gpugems2_chapter02.html
https://docs.unity3d.com/2018.1/Documentation/Manual/SparseTextures.html
https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_sparse_texture.txt
https://en.wikipedia.org/wiki/ROAM
About JP
链接: Website.
在这里插入图片描述
出生在韩国的TA。
1997年开始从事电脑图形视觉化工作后,在这个行业已经有21年经验了。
在多个网络游戏公司引领过美术团队,之前在allegorithmic担任TA负责人,在中国网易盘古工作室担任TA总监,现在是巨人网络TA部门的总负责人。
懒惰的人才有创意”是他坚信并执行的哲学道理。