繁体   English   中英

索引,glDrawElement和/或其他绘制大顶点数组的方法

[英]Indicies, glDrawElements and/or other methods of drawing big vertex arrays

我正在尝试显示一个等距曲面,该等距曲面是使用行进立方体算法构建的,我想它会生成一组三角形。 我是图形编程的完全业余爱好者,但是我在理解有效绘制图形的几种方法方面很挣扎。

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

那么,我对指标目标的看法是否正确?解决问题的正确方法是什么?

如果要一次调用就可以绘制一件大东西,可以通过提供绘制功能2件来完成:

顶点数组

您猜对了,其中有一组顶点。 3D空间中的坐标。 它们不必按任何特定顺序排列。

索引数组

这是顶点数组中的索引数组。 该数组告诉您的驱动程序顶点的顺序(什么与什么相连)。

您应该上载所有顶点,然后将它们变成索引数组中的三角形。

如果您不需要索引,那么...不要使用索引! 是的,如果多次使用同一顶点,则可以使用它们使渲染更有效率。 但是它们完全是可选的。

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

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

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

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

上面的一个较小变化是,您首先在所有网格边上循环,计算与等值面相交的边的所有顶点,然后再次存储每个边的顶点索引。 然后,当您遍历网格多维数据集以生成三角形时,只需从其相交的每个边中获取顶点索引即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM