【问题标题】:OpenGL implement level of detailOpenGL实现细节层次
【发布时间】:2017-12-20 23:29:57
【问题描述】:

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

【问题讨论】:

    标签: opengl level-of-detail


    【解决方案1】:

    您可以在一个 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)));
    

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

    【讨论】:

    • 听起来不错。但是,如果我的地形网格的最高 LOD 大约为 256x256 顶点,那么哪种方法会更有效呢?您是否仍将它们全部存储在一个缓冲区中或开始使用多个 VAO?
    • 如果我有一个由规则网格组成的地形,那么我会使用镶嵌着色器进行动态镶嵌。特别是对于地形,无论如何您都需要更靠近相机的细节。关于多个VAO:最后归结为:您是要在开始时加载所有数据,还是要在不需要时从内存中加载和删除关卡。
    • 我可能会生成地形程序。但我还不确定。会有很大的不同吗?
    • 这取决于:)。如果您的地形生成算法足够快,可以即时生成它 -> 镶嵌着色器并在那里实现它。如果太慢 -> 离线生成高度图并使用它。如果地形不能用高度图表示(我怀疑这需要比常规网格更复杂的东西作为基础)-> 将其平铺并从 HD(或主内存)流式传输。
    • 下次尝试首先提出真正的问题。 “我如何处理程序地形的细节层次?”与“我需要多个 VAO 来存储多个关卡吗?”完全不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2020-09-07
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多