OpenGL 实现细节层次

OpenGL implement 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 就足够了?

您可以将数据和索引信息存储在一个 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)));

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