9

所以我一直在编写一个程序,它使用曲面细分着色器和高度图来绘制环境。它以 32x32 平面开始,当它变得更加细分时,每个正方形顶点的高度由高度图确定。

我想要它,以便补丁离相机越近,它就越镶嵌。但是,我发现这会导致补丁之间出现间隙。如果补丁比旁边的补丁更细分,则不同的分辨率会导致间隙。

在这里,一张图胜过千言万语: 镶嵌环境 镶嵌环境

如果两个补丁具有相同的分辨率,则没有间隙。我怎样才能解决这个问题?我完全被困住了。

4

3 回答 3

10

沿边缘的 UV 坐标需要均匀变化才能无缝。当在相同的细分级别完成时,有一些非常可靠的不变性保证。然而,当两条边以不同的速率细分时,这种情况很少发生。

从技术上讲,您所拥有的被称为 T 形接头。这是因为应该共享一条边的两个表面实际上略有发散。插入一个新的置换顶点会创建两个图元,它们都不与属于相邻面片的一个图元共享一条边。

您需要使共享边缘的补丁的外部细分级别相同*:

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

   *如GPU Gems 2中的这张图所示

于 2014-05-08T02:15:43.623 回答
2

我相信您已经熟悉连续详细级别问题。在网上搜索这个提供了几种解决差距问题的方法。一个这样的网站是here,我复制了下面的图片。

在您的情况下有趣的一件事是,镶嵌似乎没有以 2^n 的方式增加/减少。因此,对于您的情况,也许将面添加到每个地形网格块的四个边界,充当窗帘,可能是唯一可行的解​​决方案。

如果您查看下图,您会看到边界具有垂直面。副作用是,如果差距足够大,那么它可能会被视为悬崖。您需要调整细节级别之间的细分,以尽量减少这种副作用。

在此处输入图像描述

于 2014-05-08T02:24:48.483 回答
0

这是我最终做的;

所以我意识到只有两个补丁之间的外部细分级别必须匹配,内部细分级别可以是他们想要的任何东西。GLSL 中的 TCS 是否让您填写以下内容以确定进行了多少细分:

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

四个 TessLevelOuter 表示补丁(正方形)四个边的细分级别。您会经过广场每个角落的位置。为了确定内部细分级别,我将这四个位置平均在一起,并获得结果与相机的距离。现在,对于由外部曲面细分级别控制的每个边缘,我平均两个适当的角位置并获得它与相机的距离。由于那必须与它旁边的补丁相匹配,因为它们共享角落,所以这是有效的。

于 2014-08-01T19:56:31.410 回答