高度图,体素,多边形(几何)地形


15

关于高度图,体素和多边形(几何)地形:

  1. 这三个之间的主要区别是什么?
  2. 您可以使用Voxels形成“平滑”地形吗,我的意思是,例如,您可以使用Voxels获得平滑的山峰,还是Voxels仅限于立方体?
  3. 在性能方面,如果世界为2000x2000单位,那么Heightmap地形,Voxel地形或基于Polygon的几何地形会更快些?(假定针对每种可能性进行渲染时都获得了“合理的”性能提升/优化)
  4. 还有更多用于地形创建的技术吗?
  5. 代表每种类型的好标题吗?

PS基于多边形的地形应充分训练,没有方形的东西。

Answers:


30

高度图

使用高度图,您只存储每个顶点的高度分量(通常作为2D纹理),并且只为整个四边形提供一次位置和分辨率。使用几何体着色器或硬件细分在每个帧中生成景观几何体。高度图是存储景观数据以进行碰撞检测的最快方法。

优点:

  • 相对较低的内存使用量:您只需要为每个顶点存储一个值,而无需索引。通过使用细节图或噪声过滤器来增加可感知的细节,可以进一步改善这一点。

  • 相对较快:高度图的几何着色器很小并且运行很快。但是,它不如几何地形快。
    在没有基于三角形的3D加速的系统上,光线行进高度图是渲染地形的最快方法。在较旧的游戏中,这被称为体素图形。

  • 动态LOD /地形:可以根据距相机的距离更改生成的网格的分辨率。如果分辨率下降得太远(大约0:40),这将导致几何图形移动,但可用于产生有趣的效果。

  • 轻松生成/创建地形:可以通过混合分形Perlin噪声等功能轻松创建高度图。噪声和高度图编辑器易于使用。两种方法可以结合使用。它们在编辑器中也很容易使用。

  • 高效的物理:水平位置直接映射到内存中的(通常)一到四个位置,因此用于物理的几何查找非常快。

缺点:

  • 每个x / y坐标恰好一个高度:通常不能在地面上有洞或悬垂的悬崖。

  • 较少的控制:仅当网格大小与纹理坐标匹配时,才可以控制每个点的精确高度。

  • 工件:如果定义一个子四边形的四个顶点不在同一平面上,则这两个顶点之间的分割将变得可见。这通常发生在陡峭的悬崖上,其边缘没有遵循基本方向。

高度图是迄今为止渲染地形的最有效方法,并且在许多不依赖高级地形功能且具有较大室外区域的较新游戏中使用。Wikipedia列出了一些使用heightmap的程序,但是我不确定这是否意味着它们仅将它们用作资源或用于渲染,因此这里有一些可能会使用它们的游戏:

  • 正当原因2:区域加载为正方形扇区,并且地形中没有孔。在演示中,存在一个深孔,该孔沿边缘通常会存在建筑物的边缘延伸了三角形。(该区域通常无法访问,但是有一些mod可以消除演示的某些限制...)

  • 模拟人生2(也许):邻域地形作为高度图加载,但是在其中放置了很多洞(建筑工地)。但是,如果您在很多地方创建悬崖,则有一些典型的文物,将地窖添加到房屋中(将悬崖藏在阳台下)相当繁琐。

  • Valve的Source引擎游戏:矩形画笔(静态关卡几何图形)的面部可能具有高度映射的地形。在这些游戏中,通常的怪癖通常会与其他画笔或道具一起隐藏。

不查看着色器就无法确定,因为每个高度图地形都可以渲染为网格。

体素

体素地形在3D网格中存储每个点的地形数据。即使您使用稀疏八叉树之类的压缩方法,此方法也始终在有意义的表面细节上使用最多的存储空间。

(术语“体素引擎”通常用于描述在较早的3D游戏中常见的光线行进地形高度图的方法。本节仅适用于存储为体素数据的地形。)

优点:

  • 连续3D数据:体素几乎是存储有关矿脉等隐藏地形特征的连续数据的唯一有效方法。

  • 易于修改:可以轻松更改未压缩的体素数据。

  • 先进的地形功能:可以创建悬垂。隧道是无缝的。

  • 有趣的地形生成Minecraft通过将噪声函数和坡度与预定义的地形特征(树木,地牢)重叠来实现。(有关更多信息,请阅读Notch博客中的Terrain Generation,第1部分。截至2011年5月5日,没有第2部分。)

缺点:

  • :要渲染体素数据,您必须使用光线跟踪器或计算网格,例如使用行进立方体(将存在伪像)。相邻体素并非独立于网格生成,着色器更复杂,通常生成更复杂的几何体。以高LOD渲染体素数据可能非常慢。

  • 巨大的存储要求:存储体素数据会占用大量内存。出于这个原因,将体素数据加载到VRAM中通常不可行,因为即使在现代硬件上,也必须使用较小的纹理来对其进行补偿。

在不依赖于诸如变形地形的体素功能的游戏中使用体素是不切实际的,但是在某些情况下它可以允许有趣的游戏机制。Voxel引擎在较旧的游戏中更为常见,但也有较新的示例:

  • Atomontage引擎:体素渲染。

  • 蠕虫4:使用“像素”。根据维基百科,这是体素和多边形的混合体。

  • Minecraft:使用体素表示RAM中的地形,图形为多边形图形。它主要是软件计算的。

  • Terraria:2D体素的示例。我不知道它是如何呈现的。

  • 与物理相结合的体素:不是游戏。但是很好地展示了销毁的潜力。

  • Voxatron:使用体素处理几乎所有图形的游戏,包括菜单和HUD。

网格

多边形网格是存储和渲染地形的最灵活,最精确的方法。它们通常用于需要精确控制或高级地形功能的游戏中。

优点:

  • 非常快:您只需要在顶点着色器中执行通常的投影计算即可。不需要几何着色器。

  • 非常精确:每个顶点的所有坐标都单独存储,因此可以水平移动它们并在细节更细的地方增加网格密度。

  • 内存影响小:这也意味着网格通常比高程图需要更少的内存,因为在具有较小特征的区域中顶点可能会更稀疏。
    (请参阅Wikipedia上的不规则三角网)。

  • 没有伪像:网格按原样渲染,因此不会出现任何毛刺或看起来奇怪的边界。

  • 先进的地形功能:可能会留下漏洞并产生悬垂。隧道是无缝的。

缺点:

  • 动态LOD差:仅适用于预先计算的网格。切换时如果没有其他数据以将旧顶点映射到新顶点,则将导致“跳转”。

  • 修改不容易:查找与应修改区域相对应的顶点很慢。

  • 碰撞检测效率不是很高:与高度图和体素数据不同,通常无法直接计算特定位置的内存地址。这意味着取决于确切的表面几何形状的物理和游戏逻辑很可能会比其他存储格式运行得慢。

多边形地形通常用于没有较大开放区域或由于高度精度和悬垂而不能使用高度图地形的游戏中。我没有清单,但是我很确定

  • 每个3D塞尔达传说和

  • 每3D Mario游戏

用这个。

其他方法

可以完全在着色器管道中创建地形。如果该算法仅在片段/像素着色器中运行,则细节几乎不受限制,而内存影响几乎为零。当相机与原始渲染表面相交时,明显的缺点几乎是无法控制形状和问题。它在太空游戏中仍然有用,在太空游戏中玩家不与行星表面互动。参数动画在这种地形上效果最佳。

应该可以从图形卡下载生成的地形几何图形,以将其用于游戏引擎的其余部分,但是我不知道它的性能如何,或者到目前为止是否已经完成。

结论

没有一种适用于每种情况的方法,但是为特定任务选择一种方法相当容易:

  • 如果您不需要在地形表面上悬垂或挖空并使用物理或动态地形,则高度图是最佳解决方案。它们具有可扩展性,并且适用于大多数游戏。

  • 网格具有最高的精度,可以描述悬垂,孔洞和隧道。如果您的地形不经常变化,请使用它们。

  • 体素非常适合描述具有许多复杂特征的动态地形。避免直接渲染它们,因为它们需要大量的内存和处理。

  • 如果您不必与地形交互或需要非常详细的图形,则其他方法可能会比上述任何一种方法更好。它们通常仅适用于非常特定的情况。

可以将不同的方法结合使用,以从多种方法中获取要素,例如,通过将网格地形细分为高程图以增加悬崖的细节结构。

动态地形生成在过程空间仿真中被大量使用,并且在最近几年中已经变得非常先进。这些项目的论坛上应该有关于该主题的一些资源。


3
源引擎不为其地形使用高度图。他们使用称为“位移​​”的网格化四边形developer.valvesoftware.com/wiki/Displacement
Tetrad

1
那是一个很好的答案,如果可能的话,在这个答案上给出+3。感谢您提供详细信息,非常感谢。
joltmode 2011年

@Tetrad可用的位移分辨率为2的幂(纹理缓冲区的常见限制),每个顶点唯一保存的坐标是高度,并且地形高度图被渲染为镶嵌四边形。Wiki还说,位移的渲染成本低于常规几何图形的渲染成本。我认为可以假设它们是同一个人,只是名字不同而已。
Tamschi 2011年

1
@NickWiggill在过去的10年中,“ voxel”的含义似乎已经发生了很大变化。我将当前的Wikipedia体素定义定义为常规3D网格上的值。在对弃儿项提到了意义的差别。我已经在我的答案中加以澄清。
Tamschi 2011年

2
旁注:“多边形地形” 在GIS中也称为“ 三角不规则网络 ”(简称“ TIN”);而且它通常比具有相同有效分辨率的高度图显着减少内存占用,因为它不会麻烦记录不必要的数据或没有数据的地方。第一个哥特式游戏使用了它(不确定其他游戏)。
马丁·索卡

8

我想指出的是,您提到的所有术语都不互斥-您甚至可以使用基于体素的游戏,该游戏使用高度图并使用多边形进行渲染。

  1. 高度图是每个特定点处地面高度的二维表示。它们通常存储为灰度图像,其中亮度表示该点的高度。体素基本上是3D位图。有多种技术可用于渲染体素空间。

  2. 您可以使用体素创建平滑的地形,并且它们不限于立方体。一种这样的方法是使用诸如行进立方体的算法,该算法可以将体素表示转换为多边形列表。

  3. 三角形最少的那个会呈现最快的:3

  4. 分形算法(例如Perlin噪声)可用于创建具有许多
    细节的景观。参数曲面(例如nurb)可用于创建几乎不需要永久存储的平滑地形。

  5. Delta Force是一款使用体素的旧游戏。Minecraft可能会使用体素存储来表示地形(不确定)。Shiny的Sacrifice是一款使用高度图达到良好效果的游戏。大多数带有风景的游戏都使用几何地形。


1
需要注意的是,在第3点上,尽管GPU只关心多边形的数量,但仍然存在几何生成方面的问题。为体素场生成几何通常比高度图地形(这是一个简单的过程)或基于多边形(显然已经是几何数据)的过程要慢(块/行进立方体都是更复杂的过程)。编辑:这还取决于您是否打算使地形变形。
迈克尔

对于第三点...好吧,高度图仍然必须处理,然后才形成几何图形,对吧?请记住,多边形网格会更快一点吗?您能否指出一些用于渲染体素的技术?
joltmode

2
您可以使用几何体着色器从高度图生成网格。这样,在着色器管道中的每个帧生成几何图形时,仅存储高度图和参数,例如位置和分辨率。它比行进立方体快,但比多边形网格慢。heighmaps的优点是内存消耗低:仅比网格所需内存的1/3多一点。缺点是它不那么灵活(没有小细节,没有悬垂)。您可以动态调整生成的网格的细节,但这会导致几何图形移动。
Tamschi 2011年

@Tamschi,如果您能提供答案,那正是我想要的。:)
joltmode 2011年

@Tom我看看是否可以格式化它,并找到更多示例。
Tamschi 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.