0

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

它工作得很好,但我在白人的最白部分和黑人的最黑部分得到了失真。基本上,它看起来像是从纹理 2 上完全不同的位置抓取了 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.. 它是如何将样本拉出边缘的?

另外..在创建纹理时是否必须使用上述钳位调用,还是在即将使用纹理时调用它?

4

1 回答 1

4

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

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

希望我的解释清楚。

于 2013-09-23T12:39:42.930 回答