OpenGL:从高度数组绘制环境的最佳方法是什么?

3
我正在编写一个使用高度图的openGL程序,用于创建一个3D户外环境。与所有高度图一样,每个点在x和z轴上与其邻居的距离相同,但y轴上的高度因程序读取的高度图而异。
到目前为止,我的程序已将高度图读入并存储在一个大小等于(图像宽度)*(图像高度)的y高度数组中。我的问题是,给定这些数据,绘制四边形环境的最有效方法是什么?
我认为以某种方式使用glDrawArrays是答案,但是最初给定的数据没有适合任何模式。例如,如果我数据数组在行之间交替,并在每列结束时停止每个条带,那么我可以使用GL_TRIANGLE_STRIP,但这需要在glDrawArrays中发送数据数组,多次存储每一行的值。 考虑到初始数组仅存储y值,这还需要将数组的大小扩大3倍。但是,每帧指定每个四边形肯定不是效率高的做法?
1个回答

3
最简单(尽管不一定是速度或内存方面最高效的)方法是为每个四边形生成两个三角形,并将其作为单个VBO上传到GPU。
正如您指出的那样,这意味着与高度图本身相比,您基本上有三倍的数据量。(应使用索引缓冲器以避免重复顶点)。
这是一个很好的教程,IMHO涵盖了这种方法:http://3dgep.com/?p=1116 另一种方法是使用三角形带并使用退化三角形将地形的每一行连接起来,以便只有一个绘制调用。但仍具有内存开销。
根据您对OpenGL的熟练程度(以及您的显卡的现代程度),您可以查看曲面细分着色器,通过直接使用高度图“纹理”解决上述问题: http://codeflow.org/entries/2010/nov/07/opengl-4-tessellation/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接