禁用Mipmapping时如何摆脱平铺边框

时间:2017-04-01 18:33:27

标签: opengl glsl lwjgl

我创建了一个片段着色器,用于平铺纹理(它实际上是一个纹理数组,正如您将在代码中看到的那样)。但是,每个瓷砖周围都有一个非常难看的1像素边框。我知道这可能是由函数的不连续引起的,导致在mipmapping时发生奇怪的事情,但我禁用了mipmapping(虽然我使用的是抗锯齿)。这是我的代码:

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

我认为我必须对舍入错误给予一点容忍,但我似乎无法弄清楚放在哪里。 如何摆脱这些丑陋的边界?提前致谢!

以下是截图: Ugly lines

1 个答案:

答案 0 :(得分:2)

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

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

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