【问题标题】:Why is a texture coordinate of 1.0 getting beyond the edge of the texture?为什么 1.0 的纹理坐标超出了纹理的边缘?
【发布时间】:2013-09-28 08:03:50
【问题描述】:

我正在使用纹理进行颜色查找以将效果应用于图片。我的查找是使用第一个纹理片段的亮度的渐变映射,然后在第二个纹理上查找。第二个纹理是 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.. 它是如何将样本拉出边缘的?

另外..我必须在创建纹理时使用上面的clamp调用还是在我即将使用纹理时调用它?

【问题讨论】:

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


    【解决方案1】:

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

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

    希望我的解释清楚。

    【讨论】:

    • 所以如果你在 GL_LINEAR 中,那么不可能在着色器内进行钳制?必须用opengl调用来钳制它吗?那个 glTexParameteri 调用呢?是绑定贴图使用的时候做还是加载贴图的时候必须做?
    • @badweasel 你可以在shader中实现钳位,GL_CLAMP_TO_EDGE实际上做的是限制坐标范围为 [0+0.5/texSize,1-0.5/texSize]。这会导致在 exact 纹素中心进行采样,因此不会发生使用相邻纹素的插值。
    • @badweasel 这个特殊保证当然只适用于采样边缘纹素时,因此得名。
    • @Andon 我得试试。我的实验表明,带有 gl_repeat 的 1.0 的 textel 在另一侧插入了 textel a。
    • @badweasel:没错,这就是你不想使用 1.0 的原因。 1.0 的值实际上位于纹理的精确边缘。它与纹理中第一个和最后一个纹素的 center 等距,因此插值将对它们两者进行同等加权。 GL_CLAMP_TO_EDGE 移动坐标 1.0 使其参考最后一个纹素的中心,因此在插值过程中最后一个纹素的权重为 1.0 所以它是唯一的出现了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多