gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:13:49 24 4
gpt4 key购买 nike

我正在使用纹理进行颜色查找以将效果应用于图片。我的查找是一个渐变贴图,使用第一个纹理片段的亮度,然后在第二个纹理上查找它。第二个纹理是 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,或者可能只是没有得到那些片段。我在着色器中添加了夹子,试图防止它超出查找纹理的边缘,但这没有帮助。我没有正确使用 clamp 吗?

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

    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.. 它是如何将样本拉出边缘的?

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

最佳答案

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

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

希望我的解释清楚。

关于ios - 为什么 1.0 的纹理坐标超出了纹理的边缘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18959024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com