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

时间:2013-09-23 12:16:06

标签: ios opengl-es-2.0 texture-mapping glsles

我正在使用纹理进行颜色查找以将效果应用于图片。我的查找是使用第一个纹理片段的亮度的渐变映射,然后在第二个纹理上查找。第二个纹理是256x256,水平渐变,几个不同的渐变从上到下。所以有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);

那么......为什么?

必须夹住纹理有点烦人,因为这意味着我在加载查找表时必须在代码中编写异常。

如果我的textPos.x和.y被钳制到0-1 ..如何将样本拉到边缘之外?

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

1 个答案:

答案 0 :(得分:3)

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

让我解释一下。当您使用带有GL_LINEAR采样的纹理时,GPU将采用与附近像素混合的像素的平均颜色(这就是为什么您没有像GL_NEAREST模式那样看到像素化 - 而是像素模糊了)。 并且使用GL_REPEAT模式纹理坐标将从0到1换行,反之亦然,与附近像素混合(即,在极坐标中,它将与纹理的相对侧混合)。 GL_CLAMP_TO_EDGE会阻止此包装行为,并且像素不会与纹理的另一侧的像素混合。

希望我的解释清楚。