Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 禁用Mipmapping时如何消除平铺边框_Opengl_Glsl_Lwjgl - Fatal编程技术网

Opengl 禁用Mipmapping时如何消除平铺边框

Opengl 禁用Mipmapping时如何消除平铺边框,opengl,glsl,lwjgl,Opengl,Glsl,Lwjgl,我创建了一个片段着色器来平铺纹理(它实际上是一个纹理数组,您将在代码中看到)。但是,我在每个瓷砖周围都有非常难看的1像素边框。我知道这可能是由于函数的不连续性造成的,导致mipmapping时发生奇怪的事情,但我禁用了mipmapping(尽管我正在使用抗锯齿)。这是我的密码: vec2 tiledCoords = fract(pass_textureCoords * 256.0) / 4.0; // pass_textureCoords are the texture coordinates

我创建了一个片段着色器来平铺纹理(它实际上是一个纹理数组,您将在代码中看到)。但是,我在每个瓷砖周围都有非常难看的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
我想我必须对舍入误差给出一点容忍度,但我似乎不知道该放在哪里我怎样才能摆脱这些丑陋的边界?提前谢谢

以下是一个屏幕截图:

我不太清楚您试图对代码中的计算做什么。第一行似乎对结果没有任何影响(在第二行中被覆盖)。由于未设置过滤模式或包裹模式,因此将启用默认设置,即线性过滤和重复模式

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


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

我不太确定您在代码中的计算是什么。第一行似乎对结果没有任何影响(在第二行中被覆盖)。由于未设置过滤模式或包裹模式,因此将启用默认设置,即线性过滤和重复模式

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


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

纹理参数设置为什么?关于包裹模式和过滤器。@请不要包裹模式或过滤器。我使用
glTexSubImage3D
(因为它是一个数组)定期加载纹理,并在渲染之前简单地绑定纹理。您是否使用
GL\u CLAMP\u TO\u EDGE
?如果没有(如您的评论所示),则纹理坐标
0.0
1.0
在您的纹理之外,并且您正在触及黑色的边界。你需要移动一个texel,因此如果你的纹理是
256x256
,那么坐标应该是间隔
<1/256,255/256>
,而不是
@Spektre我尝试了
钳制
<1/256,255/256>
范围内的纹理坐标进行测试,但没有成功。我还尝试更改纹理,以便使用此代码(我使用的是LWJGL):
GL11.glTexParameteri(GL30.GL\u纹理2D\u数组,GL11.GL\u纹理包裹,GL12.GL\u纹理包裹到边缘);GL11.glTexParameteri(GL30.GL\u纹理\u 2D\u数组、GL11.GL\u纹理\u包裹、GL12.GL\u夹紧到边缘)这也不起作用。下面是我当前获取
tiledCoords
的代码:
vec2 tiledCoords=fract(pass\u textureCoords*256.0)/4.0纹理参数设置为什么?关于包裹模式和过滤器。@请不要包裹模式或过滤器。我使用
glTexSubImage3D
(因为它是一个数组)定期加载纹理,并在渲染之前简单地绑定纹理。您是否使用
GL\u CLAMP\u TO\u EDGE
?如果没有(如您的评论所示),则纹理坐标
0.0
1.0
在您的纹理之外,并且您正在触及黑色的边界。你需要移动一个texel,因此如果你的纹理是
256x256
,那么坐标应该是间隔
<1/256,255/256>
,而不是
@Spektre我尝试了
钳制
<1/256,255/256>
范围内的纹理坐标进行测试,但没有成功。我还尝试更改纹理,以便使用此代码(我使用的是LWJGL):
GL11.glTexParameteri(GL30.GL\u纹理2D\u数组,GL11.GL\u纹理包裹,GL12.GL\u纹理包裹到边缘);GL11.glTexParameteri(GL30.GL\u纹理\u 2D\u数组、GL11.GL\u纹理\u包裹、GL12.GL\u夹紧到边缘)这也不起作用。下面是我当前获取
tiledCoords
的代码:
vec2 tiledCoords=fract(pass\u textureCoords*256.0)/4.0