Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 地形地质图LOD-消除裂缝_C++_Opengl - Fatal编程技术网

C++ 地形地质图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

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

首先,我从heightmap加载地形,然后将其划分为块(在我的示例中为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:我理解这个想法,但我真的不知道如何使用VBO实现它(见上文)。我很高兴听到一些想法。

请注意,索引缓冲区独立于正在渲染的块。相同的索引缓冲区可以(重新)用于不同的块(我之所以选择突出显示它,是因为我不明白为什么在绘制调用中对单元格[I]有这种依赖性)


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

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