我正在使用纹理进行颜色查找以将效果应用于图片。我的查找是使用第一个纹理片段的亮度的渐变图,然后在第二个纹理上查找。第二个纹理为 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.. 它如何将样本拉到边缘之外?
另外..创建纹理时我是否必须使用上面的钳位调用,或者当我要使用纹理时我可以调用它吗?