如何在禁用 Mipmapping 时摆脱平铺边界

How to Get Rid of Tiling Borders When Mipmapping is Disabled

我创建了一个片段着色器来平铺纹理(它实际上是一个纹理数组,您将在代码中看到)。但是,我在每个图块周围都有非常丑陋的 1 像素边框。我知道这可能是由于函数的不连续性造成的,导致在 mipmap 时发生奇怪的事情,但我禁用了 mipmap(尽管我正在使用抗锯齿)。这是我的代码:

vec2 tiledCoords = fract(pass_textureCoords * 256.0) / 4.0; // pass_textureCoords are the texture coordinates

out_Color = texture(testArray, vec3(tiledCoords.x, tiledCoords.y, 0)); // testArray is the sampler2DArray

我想我必须对舍入误差给予一点容忍度,但我似乎无法弄清楚该放在哪里。 我怎样才能摆脱这些难看的边框?提前致谢!

截图如下:

我不确定您要对代码中的计算做什么。第一行似乎对结果没有任何贡献(在第二行中被覆盖)。由于您没有设置过滤模式或环绕模式,您将启用默认设置,即线性过滤和重复模式。

您似乎在 [0, 0.25] 范围内使用 tiledCoords 并尝试从 0.25 到 0 换行。在这种情况下,线性过滤不会自动工作,因为没有自动换行模式0.25 -> 0 过渡。黑线是由 [0, 1/(2 * num_pixels)] 范围内的线性插值引起的,因为该区域在第 0 个纹素和“-1”纹素之间线性插值(这是由于环绕模式纹理的最后一个纹素)。同样的事情发生在范围 [0.25 - 1/(2 * num_pixels), 0.25] 中,你在纹理坐标 0.25 的左边直接插入像素,右边的纹素。

无法为您的方案获取硬件线性插值。您可以使用最近邻采样或手动计算线性插值。