我正在使用具有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来实现它(上面)。我很高兴听到一些想法。
最佳答案
请注意,索引缓冲区独立于您正在渲染的块。相同的索引缓冲区可以(重新)用于不同的块(我选择突出显示这一点,因为我不明白为什么在绘图调用中您对cell [i]具有这种依赖性)。
然后,对于一个块,您需要考虑其4个相邻块的详细程度(LOD)。如果所有四个相邻块都具有与此LOD相同的LOD,那么除了您已经在做的事情之外,别无其他事情。如果此块连接到具有较低LOD的块,则可以应用本文中引用的技巧来隐藏间隙。这意味着对于这些特定情况,您将需要额外的预先计算的索引缓冲区(每次都填满一个索引缓冲区,可能导致2 ^ 4 = 16个不同的索引缓冲区,或者您可以分开绘制调用以分别处理边框)。同样,本文的技巧仅适用于相邻块之间最大一级的间隙。您要么需要确保细节级别在空间上分布,以使两个相邻块的LOD间隔只有1。或者,您发现了另一种技巧/将其概括化。遮蔽裙(垂直延伸到块的边界)可用于隐藏具有不同LOD的块之间的较大间隙。