(待修正)
https://gamedev.stackexchange.com/questions/15573/heightmap-voxel-polygon-geometry-terrains
分类:HeightMap(StaticMesh)、Geometry(Polygon)、Voxel
HeightMap:
储存每个顶点的高度分量(2DTex),仅为整个Mesh提供一次位置和dpi
高度图是渲染地形最有效的方式,在许多不依赖高级地形功能且具有大型室外区域的游戏中使用
优点:
内存占用较低:每个顶点存一个值,无需索引。通过使用detailMap和noiseMap来增加细节
相对较快: 高度图的geometry shader比较小,且运行速度快,但运行速度不如geometry terrain
动态LOD/地形:可以根据相机距离改变生成的网格分辨率(如果分辨率下降太多,会导致形变太大)
生成地形简单:可以通过mix noise函数创建高度图,并且可以快速导入编辑器
生成物理高效:水平位置直接映射到内存中的1-4个位置,物理的geometry查找非常快
缺点:
每个X/Y坐标只有一个高度:地面无法分层,垂直的悬崖上不能有洞
控制程度低:网格大小与纹理坐标匹配的情况下,只能控制每个点的精确高度
伪影:每个地块的衔接部分如果没有对齐容易出问题(如果定义子四边形的四个顶点不在同一平面上,则两个顶点之间的分割将变得可见。这种情况通常发生在边缘不遵循基本方向的陡峭悬崖上)
Voxel:
储存3D网格中每个点的地形数据,即使压缩,比如sparse octrees,voxel terrain仍然会对每一个细节表面使用最多的存储空间
对于依赖可变形地形的游戏来说不可或缺
#我的世界
优点:
连续的3D数据:voxel是存储隐藏地形特征(矿脉等)的连续数据的唯一有效方法
便于修改:未压缩的voxel数据可以被轻松更改
高级地形特征:可以创建悬崖、两座山直接的悬挑、隧道等
更多的生成组合:eg:我的世界通过将noise函数和ramp与预定义的地形特征(树木、地牢)来叠加实现
缺点:
渲染慢:要渲染voxel数据,需要使用光追或者计算网格,例如使用marching cubes(会有伪影);相邻voxel对于网格生成来说并不独立,并且着色器更复杂会产生更复杂的geometry;渲染具有高LOD的voxel数据会非常慢
内存占用率高:需要大量内存,所以将voxel加载到VRAM中基本不可能,必须要用较小的Texture来进一步处理
Geometry:
储存和渲染地形最灵活最精确
常用于需要精确控制或者使用高级地形的游戏中
#塞尔达
#马里奥
优点:
渲染快:只需要在顶点着色器中进行投影计算,不需要使用几何着色器
非常精确:每个顶点坐标单独存储,可以水平移动他们并在需要提供细节的地方增加网格密度
内存占用低:比高度图占用更少的内存,因为在毕竟平滑的区域顶点会更稀疏
无伪影:网格按照原样渲染,不会出现奇怪的边界投影
可处理特殊地形特征:可以留下洞,产生悬挑,隧道
缺点:
动态LOD差:仅适用于预先计算的网格,在没有额外数据将旧顶点映射到新顶点的情况下进行切换时会产生跳变
不易修改:查找与修改对应区域顶点时很慢
碰撞检测效率低:针对某个位置的内存地址无法直接计算,所以依赖于精确表面几何形状的物理和游戏逻辑会比其他存储格式运行更慢
结论:
- 如果不需要地形表面产生悬挑、洞或使用物理、动态地形,建议使用HeightMap
- Voxel适用于具有许多复杂地形特征的动态地形,但需要避免直接渲染
- 如果地形复杂但不会变化,建议使用Geometry(拥有最高精度)
浙公网安备 33010602011771号