GLSL细分环境-补丁之间的间隙

9
所以我一直在编写一个使用镶嵌着色器和高度图来绘制环境的程序。它最初是一个32x32的平面,当它被更多地镶嵌时,每个正方形顶点的高度由高度图确定。
我希望离相机越近的修补程序越被镶嵌。然而,我发现这会导致修补程序之间出现间隙。如果一个修补程序比旁边的修补程序更被镶嵌,不同的分辨率会导致间隙。
如下图片说明了问题: Tessellated Environment Tessellated Environment 如果两个修补程序具有相同的分辨率,则没有间隙。我该如何解决这个问题?我完全陷入了困境。
3个回答

10
UV坐标沿着边缘需要均匀变化才能无缝连接。当在相同细分级别下完成时,有一些相当可靠的不变性保证。然而,当两个边缘以不同的速率进行子细分时,这种情况很少发生。
从技术上讲,你所拥有的是一个T形接口。它发生是因为两个表面应该共享一个边缘,但实际上略有分歧。插入一个新的偏移顶点会创建两个原语体,其中没有一个与相邻补丁的一个原语体共享边缘。

你需要使外部细分级别对于共享边缘的补丁相同:

http://http.developer.nvidia.com/GPUGems2/elementLinks/07_tessellation_08.jpg

*如GPU Gems 2中所示


2

我相信你已经熟悉了连续细节问题。在网上搜索这个问题会得到几种解决间隙问题的方法。其中一个网站是这里,我复制了下面的图片。

在你的情况下,有趣的一点是曲面细分似乎不是按2^n递增/递减的方式进行的。因此,在你的情况下,可能将面添加到每个地形网格块的四个边界上,作为帷幕,可能是唯一可行的解决方案。

如果你看一下下面的图片,你会看到边界有垂直的面。 副作用是,如果间隙足够大,那么它可能被看作是悬崖。你需要调整细节级别之间的曲面细分,以最小化这种副作用。

enter image description here


0

这是我最终采取的方案;

所以我意识到,在两个路径之间只有外部镶嵌级别需要匹配,内部镶嵌级别可以任意设置。在GLSL中,TCS让你填写以下信息来确定进行多少次细分:

gl_TessLevelInner[0]
gl_TessLevelInner[1]
gl_TessLevelOuter[0]
gl_TessLevelOuter[1]
gl_TessLevelOuter[2]
gl_TessLevelOuter[3]

四个TessLevelOuter代表了四边(正方形)的细分级别。你会传递正方形每个角的位置。为了确定内部细分级别,我将这四个位置平均并计算其与相机的距离。现在对于每条边(由外部细分级别控制),我将两个适当的角落位置取平均并计算其与相机的距离。由于需要和旁边的面片匹配,因为它们共享角落,所以这样可以实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接