为什么1.0的纹理坐标超出了纹理的边缘?

我正在做一个颜色查找使用纹理应用效果的图片。 我的查找是使用第一个纹理片段的亮度的梯度图,然后在第二个纹理上查看。 第二个纹理是256×256,水平渐变和几个不同的渐变从上到下。 所以32个水平条纹每8个像素高。 我在x上的查找是亮度,在y上它是一个渐变,我瞄准条纹的中心,以避免交叉。

我的片段着色器看起来像这样:

lowp vec4 source = texture2D(u_textureSampler, v_fragmentTexCoord0); float luminance = 1.0 - dot(source.rgb, W); lowp vec2 texPos; texPos.x = clamp(luminance, 0.0, 1.0); // the y value selects which gradient to use by supplying a T value // this would be more efficient in the vertex shader texPos.y = clamp(u_value4, 0.0, 1.0); lowp vec4 newColor1 = texture2D(u_textureSampler2, texPos); 

它运作良好,但我在白人的最白部分和黑人的最黑部分变得歪曲。 基本上它看起来像从texture2上完全不同的地方抓取了newColor,或者可能只是没有得到这些碎片。 我在着色器中添加了夹子,试图避免在查找纹理的边缘之外,但是这并没有帮助。 我没有正确使用夹子吗?

最后,我认为这可能与我的源纹理或它的加载方式有关。 我最终通过添加:

  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

所以为什么?

这是一个有点恼人的钳位纹理,因为这意味着当我加载查找表时,我不得不写我的代码中的exception。

如果我的textPos.x和.y被钳位到0-1 ..它是如何将一个样本拉出边缘?

另外..当创build纹理时,我是否必须使用上面的钳位调用,或者在我即将使用纹理时可以调用它吗?

这是纹理采样器的正确行为。

让我解释一下。 当您使用GL_LINEAR采样纹理时,GPU将采用与相邻像素混合的像素的平均颜色(这就是为什么像GL_NEAREST模式那样看不到像素化 – 而像素则是模糊的)。 GL_REPEAT模式的纹理坐标将从0到1,反之亦然,与相邻像素混合(即在极坐标中,它将与纹理的相反侧混合)。 GL_CLAMP_TO_EDGE可以防止这种缠绕行为,并且像素不会与纹理反面的像素混合。

希望我的解释清楚。