所以我一直在编写一个程序,它使用曲面细分着色器和高度图来绘制环境。它以32x32平面开始,当它得到更多细分时,每个方形顶点的高度由高度图确定。
我想要它,以便补丁越接近相机,它得到的细分越多。但是,我发现这会导致补丁之间的差距。如果补丁的镶嵌细分比旁边的补丁更多,则不同的分辨率会导致间隙。
在这里,一张图片胜过千言万语:
如果两个补丁具有相同的分辨率,则没有间隙。我怎样才能解决这个问题?我完全卡住了。
答案 0 :(得分:8)
沿着边缘的UV坐标需要均匀变化,以使其无缝。当在相同的细分级别完成时,有一些非常可靠的不变性保证。然而,当两条边以不同的速率细分时,这种情况很少发生。
从技术上讲,你所拥有的是一个T-Junction。之所以会发生这种情况,是因为 假定 的两个表面共享边缘实际上略微发散。插入新的移位顶点会创建两个基元,其中 与一个基元属于相邻的补丁共享边缘。
*如此图GPU Gems 2
所示答案 1 :(得分:2)
我相信您已经熟悉了连续细节水平问题。在网上搜索这个可以解决差距问题的几种方法。其中一个网站是here,我复制了下面的图片。
在你的情况下,一件有趣的事情是,细分似乎没有以2 ^ n的方式递增/递减。因此,对于您的情况,可能在每个地形网格块的四个边界上添加面,作为窗帘,可能是唯一可行的解决方案。
如果您查看下面的图片,您会看到边界有垂直面。 副作用是,如果差距足够大,那么它可能被视为悬崖。您需要调整细节级别之间的细分以最大限度地减少这种副作用。
答案 2 :(得分:0)
这是我最终做的事情;
所以我意识到只有两个补丁之间的外部曲面细分级别必须匹配,内部曲面细分级别可以是他们想要的任何东西。 GLSL中的TCS让您填写以下内容以确定完成细分的次数:
gl_TessLevelInner[0]
gl_TessLevelInner[1]
gl_TessLevelOuter[0]
gl_TessLevelOuter[1]
gl_TessLevelOuter[2]
gl_TessLevelOuter[3]
四个TessLevelOuter表示贴片四边的曲面细分级别(正方形)。您将沿着广场每个角落的位置通过。为了确定内部曲面细分级别,我将这四个位置平均在一起并获得结果与摄像机的距离。现在,对于由外部曲面细分级别控制的每个边缘,我平均两个适当的角落位置并获得与相机的距离。因为它必须匹配它旁边的补丁,因为它们共享角落,这是有效的。