OpenGL实现细节级别

时间:2017-07-16 09:37:27

标签: opengl level-of-detail

我想将我的多边形细节算法实现到我的3d引擎中。我得到的是以下内容:

1。具有多个多边形数量的实体,例如:

House: 

1. -Entity1:   10000 polygons            viewrange[0,100]
2. -Entity1:   5000  polygons            viewrange[100,300]
3. -Entity1:   800   polygons            viewrange[300,1000]
4. -Entity1:   100   polygons            viewrange[1000,infinity]

通常,我会创建一个新的VAO,包括每个实体的VBO,但是有更聪明的方法来实现吗?我可以只使用一个VAO并通过更改索引缓冲区来调整细节级别吗?

我创建了一个例子。我目前正在处理地形网格,需要对它们应用LoD:

不同索引缓冲区的示例,但我如何交换它们?这有效吗?

在OpenGL中实现LoD的最佳方法是什么?我需要多个VAO还是一个VAO?

1 个答案:

答案 0 :(得分:2)

您可以将数据和索引信息存储在一个VAO中。如果将所有索引添加到一个缓冲区中,则可以通过在draw命令中指定起始索引和索引量来调整要绘制的级别。

对于您的示例,您将创建一个包含30个索引的索引缓冲区,其中索引0-5用于级别1,6-29用于级别2.然后可以通过调用绘制级别1:

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

和第2级通过调用:

glDrawElements(GL_TRIANGLES, 24, GL_UNSIGNED_INT, (void*)(6 * sizeof(GLuint)));

请注意,此方法要求您始终拥有存储中的所有级别。根据您的需要,这可能不是您想要的。