【问题标题】:Terrain GeoMipMapping LOD - eliminating cracks地形 GeoMipMapping LOD - 消除裂缝
【发布时间】:2013-03-25 20:22:30
【问题描述】:

我正在使用带有 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(上图)来实现它。我很乐意听到一些想法。

【问题讨论】:

  • 最简单的解决方案可能只是从下一个块向南复制北行顶点(以及其他方向),并确保它们在 NS/EW 轴上对齐。您不会丢失任何数据,只需将边界顶点复制到相邻块中,以便它们必须对齐。
  • 另一个简单的解决方案是在有接缝的地方渲染两个 LOD。

标签: c++ opengl


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2012-06-11
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多