1

我正在使用带有 VBO 和索引等的现代 OpenGL。

首先我从高度图加载地形,然后将其划分为块(在我的情况下为 128x128)我将所有顶点加载到 VBO(对于每个地形块)然后我有 4 个 LOD 级别 - 索引表 - 它是非常静态的。

在渲染时,我只是根据与相机的距离来选择块

    if(distance > 768.0)
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cells[i].elementbuffer_lod4);
    else if(distance > 512.0)
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cells[i].elementbuffer_lod3);
    else if(distance > 128.0)
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cells[i].elementbuffer_lod2);
    else
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cells[i].elementbuffer_lod1);

在这里我遇到了一个问题。一切正常,但我在不同的 lod 级别块之间有非常难看的裂缝。我在谷歌搜索时发现了这样的pdf:http://www.flipcode.com/archives/article_geomipmaps.pdf理解这个想法,但我真的不知道如何使用VBO(上图)来实现它。我很乐意听到一些想法。

4

1 回答 1

0

请注意,索引缓冲区独立于您正在渲染的块。相同的索引缓冲区可以(重新)用于不同的块(我选择突出显示这一点,因为我不明白为什么您在绘图调用中对 cells[i] 有这种依赖性)。

然后对于一个块,您需要考虑其 4 个相邻块的细节级别 (LOD)。如果所有 4 个相邻块都具有与这个相同的 LOD,那么除了您已经在做的事情之外,没有什么可做的了。如果此块连接到具有较低 LOD 的块,则您可以应用文章中引用的技巧来隐藏间隙。这意味着对于这些特定情况,您将需要额外的预先计算的索引缓冲区(每次一个完整的索引缓冲区,可能导致 2^4 = 16 个不同的索引缓冲区,或者您可以拆分绘图调用以分别处理边界)。此外,文章中的技巧仅适用于相邻块之间最大一级的间隙。您要么需要确保您的细节级别在空间上以这样的方式分布,即两个相邻块在 LOD 中只有 1 的间隙。或者你找到另一个技巧/概括这个。遮蔽裙边(垂直突出块的边界)可用于隐藏具有不同 LOD 的块之间的宽间隙。

于 2013-12-31T16:34:25.703 回答