Indicies,glDrawElements和/或绘制大顶点数组的其他方法

时间:2016-07-14 19:36:56

标签: c++ opengl surface cubes

我正在尝试显示使用行进立方体算法构建的等值面,我想这会生成一组三角形。然而,我是图形编程的完全业余爱好者,我正在努力理解有效绘制它们的几种方法。

我想到的是使用glVertexPointer-glDrawElement构造之类的东西在一次调用中绘制所有内容。然而,后者要求我知道指数,我显然不知道它们。此外,我实际上并不完全确定它们的用途:我认为它们只是一个,duh,索引,驱动程序将使用它们的顺序,以及通过排除多次出现的相同顶点来节省内存的方法。

所以,我对指数的看法是什么?目的正确,解决问题的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

如果你想通过一次调用绘制一个大的东西,你可以通过提供绘图功能2来做到这一点:

顶点数组

这是一个数组,你猜对了,顶点。在3D空间中进行协调。它们不必按任何特定顺序排列。

索引数组

顶点数组中的索引数组。 这个数组告诉你的驱动程序顶点的顺序(与什么连接)。

您应该上传所有顶点,然后将它们转换为索引数组中的三角形。

答案 1 :(得分:0)

如果您不需要索引,那么......不要使用索引!是的,如果多次使用相同的顶点,它们可用于提高渲染效率。但它们完全是可选的。

在没有索引的情况下渲染时使用的绘制调用是glDrawArrays()。这将根据传递给绘制调用的基元类型,以自然顺序使用顶点缓冲区中的顶点。例如,使用GL_TRIANGLES,它将绘制一个三角形,其顶点位于缓冲区中的位置(0,1,2),一个带顶点的三角形(3,4,5)等。

因此,在您的等值面算法中,您可以在每次生成三角形时简单地计算3个顶点,并将它们附加到最终存储在顶点缓冲区中的顶点列表中。然后用glDrawArrays(GL_TRIANGLES, ...)绘制整个事物,那就是全部。

现在,在覆盖表面的网格中,相同的顶点由大约6个三角形的平均值共享(查看常规网格以查看此数字的派生方式)。因此,如果为每个三角形单独生成顶点,则您将使用相同的顶点大约6次,从而导致大量不必要的内存使用,以及顶点处理的时间。

这是索引的来源。您可以使用的一种方法是,对于网格的每个边缘,您可以跟踪边缘上的等值面顶点是否已经创建,并存储其索引(如果是)。然后,在生成三角形的任何时候需要网格边的顶点时,如果边还没有顶点,则创建一个新顶点(带有新索引),或者使用已创建顶点的索引。然后将结果索引序列存储在索引缓冲区中,并使用glDrawElements(GL_TRIANGLES, ...)进行绘制。

上述的一个微小变化是,首先遍历所有网格边,计算与等值面相交的边的所有顶点,然后再为每个边存储顶点索引。然后,当您遍历网格立方体以生成三角形时,您可以简单地从每个相交边缘抓取顶点索引。