1

我想在我的 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 就足够了?

4

1 回答 1

2

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

对于您的示例,您将创建一个具有 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)));

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

于 2017-07-16T09:49:08.570 回答