Mapgen4-0: 通过unity学习地形生成
来源:https://www.redblobgames.com Mapgen4: goals
本文的知识点是从 mapgen4 学来的,然后我自己弄了一个 mapgen4的unity版本。
有用到的知识点:
- 泊松分布采样
- Delaunay三角剖分算法
- 泰森多边形又叫冯洛诺伊图(Voronoi diagram)
- 噪音取样
断断续续将近两个月,终于把mapgen4基本翻译成Unity版本的了。
想在回想来,深入理解这个代码,门槛还是有的,喜欢敲代码的人才能看得进去。
程序的整体流程
数据生成
- 刚开始只有一些参数,最重要的是随机种子 整型数字 seed
- 泊松采样一次认定为山峰的点,然后再采样一次为其余地形的点
- 把采样的点进行Delaunay三角剖分,然后得到代表泰森多边形的数据
- 细化处理一下山峰的点,生成地形海拔数据
- 计算地形风向、降雨量、湿度分布,生成地形湿度数据
- 计算地形高度落差,地形高度排序;相对于河流,逆转顺序由低往高,从海岸线开始计算,生成河流线路;再根据湿度总和生成河流宽度。
地形渲染
- 生成河流网格数据
- 渲染成河流贴图 顶视图相机
- 生成地形网格数据
- 渲染成海拔高度贴图 顶视图相机
- 渲染成海拔高度贴图 当前相机
- 根据顶视图相机高度贴图计算植被颜色,根据当前相机高度贴图计算地形边缘加深效果
- 渲染最终地形效果到地形贴图,每次有更新后才渲染一次
- 在UI界面输出地形贴图
程序中数据生成相关都在 MapJobs 文件夹下面,渲染逻辑控制是 MapMesh.cs 文件;实际渲染逻辑是shander实现的,我把mapgen4 glsl代码 翻译成 unity cg代码;在 Shaders 文件夹下面,其中 VertexColorsOnly.shader 是重要逻辑,里面有 3个pass用来计算边缘加深效果outlines。