【问题标题】:Correct way to split quads for terrain made from heightmap?为由高度图制成的地形分割四边形的正确方法?
【发布时间】:2017-10-09 17:52:34
【问题描述】:

高度图中的单个像素/值只会为您提供一个由不同高度的顶点组成的二维网格,因此您必须将它们与四边形连接起来。如果四边形的所有 4 个顶点都是共面的,那就很容易了,但是当它们不是共面的时候,你需要一些分割规则。一种方法是选择较短/较长的边缘,另一种使用较高的边缘,等等......我发现另一种方法是计算四边形的中心顶点(所有 4 个高度的平均值),尽管这会使数字翻倍远非最佳的三角形。

分割四边形的正确方法是什么?或者有没有四边形的替代品?

【问题讨论】:

    标签: opengl terrain heightmap


    【解决方案1】:

    一般规则是拆分应与局部曲面曲率卷曲对齐。简单的对角分割适用于高斯曲率为 0 的曲面(平面、圆柱),但建议对非零高斯曲率进行中点细分分割细化。

    【讨论】:

      【解决方案2】:

      我根本不会使用四边形。对于实际的地形高度图,高度永远不会共面,GPU 不喜欢四边形而不是三角形,事实上,它会在内部将四边形分成 2 个三角形。

      但是,我不太关心拆分规则。根据我在地形渲染器中工作的经验,您可以做的最好的事情之一是拥有一个小的 2D 三角形网格图块(如 128x128 顶点)并根据需要重复它多次,每个图块一个高度图作为纹理传递。

      重复相同的 2D 平铺而不是更典型的 3D 网格的原因是内存使用量和内存带宽将大大减少,因为如果您使用 3D 网格,您可能需要 3xFP32 值(每个顶点)将被填充到 4xFP32(128 位),但如果您使用我的 2D 平铺方法,您只需要 2xU8(16 位)+ 1xFP16(16 位)= 32 位。那是 4 倍的内存带宽减少,内存使用量会更好:内存使用量减少 8 倍。请记住,除非您有一个非常复杂的片段着色器(不太可能用于地形渲染器),否则您将在大多数 GPU 中遇到内存带宽瓶颈。

      将此与四叉树(用于 LOD)和法线贴图相结合,您将获得非常好的质量/性能比。

      【讨论】:

      • 这样的二维三角形网格是如何工作的?你能提供/链接到一个例子吗?另外,当我说四边形时,我的意思是一对形成四边形的两个三角形,即我在 CPU 上进行四边形拆分并使用 GL_TRIANGLES 进行渲染。
      • 我没有链接,但是... 2D 三角形网格就是这样的一个网格:photos1.blogger.com/blogger2/2483/1050461954730077/320/… 它只是一个规则的网格,并且分裂总是在同一个方向。每个顶点的高度将通过对 2D 纹理(高度图)进行采样来计算。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多