2017-05-10 30 views
1

heightmap中的单个像素/值仅为您提供高度不同的顶点的2D网格,因此您必须将它们与四边形连接起来。如果一个四边形的所有4个顶点都是共面的,那么这很容易,但是当它们不是时,您需要一些分割规则。一种方法是选择较短/较长的边缘,另一种使用较高的边缘,等等......另一个我发现的作品是计算四个中心顶点(所有4个高度的平均值),尽管这使得数量增加了一倍三角形远不是最优的。正确的方法来分裂四边形由高度图制成的地形?

拆分四边形的正确方法是什么?还是有替代四边形?

回答

1

一般规则是分割应该与局部表面曲率卷曲对齐。对于高斯曲率为0的平面(平面,圆柱体),简单的对角线分割适用,但对于非零高斯曲率,推荐使用中点细分分割细化。

1

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

但是,我不会在乎分裂规则。从我在地形渲染器中工作的经验来看,您可以做的最好的事情之一是创建一个小的二维三角形网格拼贴(如128x128顶点),并根据需要重复多次,每个拼贴一个高度贴图作为纹理传递。

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

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

+0

这样的二维三角网格是如何工作的?你能提供/链接到一个例子吗?另外,当我说quad时,我的意思是一对形成四边形的两个三角形,即我在CPU上进行四边形分割并使用“GL_TRIANGLES”进行渲染。 – Wingblade

+0

我没有链接,但... 2D三角形网格只是一个这样的网格:http://photos1.blogger.com/blogger2/2483/1050461954730077/320/Mesh.0.jpg它只是一个规则的网格,分裂总是在同一个方向。每个顶点的高度将通过采样2D纹理(高度图)来计算。 – dv1729