来源:https://www.redblobgames.com Mapgen4: goals

本文的知识点是从 mapgen4 学来的,然后我自己弄了一个 mapgen4的unity版本

有用到的知识点:

断断续续将近两个月,终于把mapgen4基本翻译成Unity版本的了。
想在回想来,深入理解这个代码,门槛还是有的,喜欢敲代码的人才能看得进去。

程序的整体流程


数据生成

  • 刚开始只有一些参数,最重要的是随机种子 整型数字 seed
  • 泊松采样一次认定为山峰的点,然后再采样一次为其余地形的点
  • 把采样的点进行Delaunay三角剖分,然后得到代表泰森多边形的数据
  • 细化处理一下山峰的点,生成地形海拔数据
  • 计算地形风向、降雨量、湿度分布,生成地形湿度数据
  • 计算地形高度落差,地形高度排序;相对于河流,逆转顺序由低往高,从海岸线开始计算,生成河流线路;再根据湿度总和生成河流宽度。

地形渲染

  • 生成河流网格数据
  • 渲染成河流贴图 顶视图相机
  • 生成地形网格数据
  • 渲染成海拔高度贴图 顶视图相机
  • 渲染成海拔高度贴图 当前相机
  • 根据顶视图相机高度贴图计算植被颜色,根据当前相机高度贴图计算地形边缘加深效果
  • 渲染最终地形效果到地形贴图,每次有更新后才渲染一次
  • 在UI界面输出地形贴图

程序中数据生成相关都在 MapJobs 文件夹下面,渲染逻辑控制是 MapMesh.cs 文件;实际渲染逻辑是shander实现的,我把mapgen4 glsl代码 翻译成 unity cg代码;在 Shaders 文件夹下面,其中 VertexColorsOnly.shader 是重要逻辑,里面有 3个pass用来计算边缘加深效果outlines。