Terrain GeoMipMapping LOD - 消除裂缝

时间:2013-03-25 20:22:30

标签: c++ opengl

我正在使用带有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级别块之间有非常难看的裂缝。我在google搜索时找到了这样的pdf:http://www.flipcode.com/archives/article_geomipmaps.pdf我理解了这个想法,但我真的不知道如何使用VBO实现它(上图)。我很乐意听到一些想法。

1 个答案:

答案 0 :(得分:0)

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

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