使用顶点缓冲区使用 OpenGL 显示常规网格的最快方法是啥?

Posted

技术标签:

【中文标题】使用顶点缓冲区使用 OpenGL 显示常规网格的最快方法是啥?【英文标题】:What is the fastest way to show a regular grid with OpenGL using vertex buffer?使用顶点缓冲区使用 OpenGL 显示常规网格的最快方法是什么? 【发布时间】:2013-09-09 07:29:14 【问题描述】:

所以我有一个数字高程模型的点矩阵,比如说 1024x1024 网格,单元格间距为 1 个单位。

我不想用 OpenGL 在 C++ 中使用顶点缓冲区以最快的方式显示这个 DEM。 由于我的数据集分散在图块中,因此我在移动相机时必须进行大量加载,因此这需要非常快。

显示这样的网格的最快方法是什么?我需要进行某种三角测量还是有更快的方法?

【问题讨论】:

您是否尝试过简单的实现是否足够快?具有 1024x1024 顶点的网格听起来甚至不值得优化。在您有实际需要分析的内容之前不要进行优化。 @IInspectable 我有数百个这样的图块,它们将即时生成。这就是为什么它需要快速。否则用户体验会受到影响。 【参考方案1】:

在 OpenGL 中正确,您必须先进行三角测量。如果您只是想要一个简单的解决方案,您可以使用下图所示的方案。

您将每个数据点变成一个顶点。数据点的索引变为 x 和 y 坐标;高度值变为 z 坐标。

现在你必须创建一个顶点索引列表。第一个三角形的索引为 [0, 1, 1024],第二个三角形的索引为 [1024, 1, 1025],依此类推。您将数组绘制为GL_TRIANGLES

有more efficient ways to triangulate height fields,但除非你真的不得不去,否则我不会去那里。

【讨论】:

【参考方案2】:

我的方法是使用均匀分布的 x-z 坐标初始化 1024x1024 顶点缓冲区。高度可以在顶点着色器中通过每个补丁 1024x1024 像素高度纹理进行采样。顶点缓冲区可以根据可见块重新渲染,提供不同的高度纹理和不同的 x-z 坐标偏移。

【讨论】:

或者更好的是,根据顶点索引计算 X-Z,根本不需要缓冲区。 我不确定我是否理解 x-z 坐标。您的意思是 1024x1024 缓冲区,其中存储在缓冲区中的值是每个 x-y 位置的 z 值,网格表示 x-y 坐标系? 在 OpenGL 中:x 和 z 是两个水平轴。 y 是高度轴。

以上是关于使用顶点缓冲区使用 OpenGL 显示常规网格的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBO 在 OpenGL 中渲染人群

OpenGL顶点数组对象不记录VBO和IBO绑定

如何在OpenGl中计算三角形网格的顶点法线?

使用 GLM 库在 OpenGL 中绘制顶点时如何使用常规坐标系

在 OpenGL 中为索引缓冲区对象使用结构会导致段错误

如何在OpenGL中计算三角形网格的顶点法线?