所以我正在编写一个带有高度映射的openGL程序来构建一个3D室外环境。与所有高度映射一样,每个点与x& z轴上的相邻点的距离相同,但每个顶点的y轴不同,具体取决于程序读入的高度图。
到目前为止,我的程序存储在高度图中读取并存储在大小与(image_width)*(image_height)相等的y高度数组中。我的问题是,在给出这些数据的情况下,绘制四边形环境的最有效方法是什么?
我认为以某种方式使用glDrawArrays是答案,但最初没有模式可以使用给定的数据。例如,如果我的数据数组在行之间交替并且如果我在列的末尾停止每个条带,我可以使用GL_TRIANGLE_STRIP,但是这需要将数据数组发送到glDrawArrays以多次存储来自每行的值。考虑到初始数组只存储y值,它还需要一个大小为x3的数组。但是,确定在给定数据的每一帧中指定每个四边形根本不会有效吗?
答案 0 :(得分:1)
最简单的(虽然在速度或内存方面不一定最有效)是为每个四元组生成两个三角形,并将其作为单个VBO上传到GPU。
正如你所指出的那样,这意味着你的数据量基本上是高度图本身的三倍。 (应该使用索引缓冲区,因此没有重复的顶点)。
这是一个很好的IMHO教程,涵盖了这种方法:http://3dgep.com/?p=1116
另一种方法是使用三角形条带并使用退化三角形链接地形的每一行,这样您只能进行一次绘制调用。仍然有内存开销。
根据您对OpenGL的熟练程度(以及您的显卡的现代程度),您可以直接使用高度贴图'纹理'来查看解决上述问题的tesselation着色器:
http://codeflow.org/entries/2010/nov/07/opengl-4-tessellation/