C++ 地形地质图LOD-消除裂缝
我正在使用带有VBO和索引等的现代OpenGL 首先,我从heightmap加载地形,然后将其划分为块(在我的示例中为128x128) 我将所有顶点加载到VBO中(对于每个地形块) 然后我有4个LOD级别-索引表-它是非常静态的 渲染时,我只是根据与摄影机的距离拾取块C++ 地形地质图LOD-消除裂缝,c++,opengl,C++,Opengl,我正在使用带有VBO和索引等的现代OpenGL 首先,我从heightmap加载地形,然后将其划分为块(在我的示例中为128x128) 我将所有顶点加载到VBO中(对于每个地形块) 然后我有4个LOD级别-索引表-它是非常静态的 渲染时,我只是根据与摄影机的距离拾取块 if(distance > 768.0) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cells[i].elementbuffer_lod4); else if
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:我理解这个想法,但我真的不知道如何使用VBO实现它(见上文)。我很高兴听到一些想法。请注意,索引缓冲区独立于正在渲染的块。相同的索引缓冲区可以(重新)用于不同的块(我之所以选择突出显示它,是因为我不明白为什么在绘制调用中对单元格[I]有这种依赖性)
然后,对于一个块,需要考虑它的4个相邻块的细节级别(LOD)。如果所有4个相邻的块都具有与此块相同的LOD,那么除了您已经在做的事情之外,没有什么可以做的了。如果此块连接到具有较低LOD的块,则可以应用本文中引用的技巧来隐藏间隙。这意味着您将需要针对这些特定情况使用额外的预计算索引缓冲区(或者每次使用一个完整的索引缓冲区,可能会导致2^4=16个不同的索引缓冲区,或者您可以拆分绘制调用以单独处理边界)。此外,文章中的技巧仅适用于相邻块之间最大一级的间隙。您需要确保细节级别在空间上的分布方式确保两个相邻块在LOD中的间距仅为1。或者你找到另一个窍门/推广这个窍门。遮罩裙板(垂直挤出块的边界)可用于隐藏具有不同LOD的块之间的宽间隙。
最简单的解决方案可能只是从下一个块南复制北行顶点(以及其他方向的顶点),并确保它们在NS/EW轴上对齐。您不会丢失任何数据,只需将边界顶点复制到相邻的块中,这样它们就必须对齐。另一个简单的解决方案是在有接缝的地方渲染两个LOD。