2

所以我正在编写一个带有高度映射的openGL程序来制作一个3D户外环境。与所有高度映射一样,每个点在 x&z 轴上与其相邻点的距离相同,但每个顶点的 y 轴不同,具体取决于程序读取的高度图。

到目前为止,我的程序将读取存储在高度图中,并存储在大小等于 (image_width)*(image_height) 的 y 高度数组中。我的问题是,在给定这些数据的情况下,绘制四边形环境的最有效方法是什么?

我认为以某种方式使用 glDrawArrays 是答案,但最初没有任何模式可以处理给定的数据。例如,如果我的数据数组在行之间交替并且如果我在列的末尾停止每个条带,我可以使用 GL_TRIANGLE_STRIP,但是这将需要发送到 glDrawArrays 的数据数组多次存储每行的值。考虑到初始数组仅存储 y 值,它还需要一个数组的大小与我的初始数组相比为 x3。但是,在给定数据的情况下,每帧指定每个四边形肯定不会是有效的吗?

4

1 回答 1

2

最简单的(尽管在速度或内存方面不一定最有效)是为每个四边形生成两个三角形并将其作为单个 VBO 上传到 GPU。

正如您所指出的那样,这意味着您的数据量基本上是高度图本身的三倍。(应该使用索引缓冲区,因此没有重复的顶点)。

这是一个很好的教程恕我直言,涵盖了这种方法:http: //3dgep.com/ ?p=1116

另一种方法是使用三角形条并使用退化三角形链接地形的每一行,这样您就只有一个绘图调用。虽然仍然有内存开销。

根据您对 OpenGL 的熟练程度(以及您的显卡的现代程度),您可以查看通过直接使用高度图“纹理”来解决上述问题的镶嵌着色器:

http://codeflow.org/entries/2010/nov/07/opengl-4-tessellation/

于 2014-04-15T16:07:53.753 回答