GLSL问题:偏移和反向坐标在不同的机器上产生不同的结果

GLSL问题:偏移和反向坐标在不同的机器上产生不同的结果,glsl,webgl,Glsl,Webgl,我有一个GLSL片段着色器源,它在我们的一半机器上产生正确的结果,而在另一半机器上产生错误的(但一致的)结果 我基本上有两个矩阵或数组,我正在添加。数据映射到大小为7x9的2D纹理。两个输入的标识大小均为60或32。我的代码找到的最接近的纹理大小是7x9 以下脚本在所有计算机上生成正确的结果。TexCoords是我的朋友: glFragColor = texture2D(A, TexCoords) + texture2D(B, TexCoords); 但是,以下(简化)版本不适用。这表

我有一个GLSL片段着色器源,它在我们的一半机器上产生正确的结果,而在另一半机器上产生错误的(但一致的)结果

我基本上有两个矩阵或数组,我正在添加。数据映射到大小为7x9的2D纹理。两个输入的标识大小均为60或32。我的代码找到的最接近的纹理大小是7x9

以下脚本在所有计算机上生成正确的结果。TexCoords是我的朋友:

    glFragColor = texture2D(A, TexCoords) + texture2D(B, TexCoords);
但是,以下(简化)版本不适用。这表明我将坐标映射到偏移量和背面的逻辑不正确,或者这里有更神秘的东西:

    const float xScale = 7.0; // x size of the texture
    const float yScale = 9.0; // y size of the texture
    float s = TexCoords.s * xScale; // denormalize x
    float t = TexCoords.t * yScale; // denormalize y
    int offset = int(t) * 7 + int(s); // flattened offset from 0

    s = mod(float(offset), 7.0); // recalc x from offset
    t = floor(float(offset) / 7.0); // recalc y from offset

    vec2 coords = vec2(s / xScale, t / yScale); // normalize
    glFragColor = (texture2D(A, coords) + texture2D(B, coords);
正确结果示例(截断)

不正确的示例:

ACTUAL: type=float32; dims=[3,4,5]; data=[1.0915919542312622,1.0915919542312622,0.04060405492782593,...  

通过大量的尝试和错误,我意识到从非规范化的数字到规范化的坐标,我不能仅仅用纹理的宽度/高度除以偏移/索引。必须包含一些公差。例如,TexCoords中的实际数字从不从0开始。它们从不在1/w或1/h上,但总是明显地变大或变小

所以现在我在得到标准化坐标之前,在我的索引中添加了一个0.5(我仍然没有科学的理由):

vec2 coords = vec2((s+0.5)/xScale, (t+0.5)/yScale)

这里有一个更好的方法:另一个答案是错误的。你上面所说的是正确的。我试图回答你的问题,但我的答案被删除为重复,所以显然我应该以重复的形式结束你的问题,因为答案是相似的。我不同意这是一个重复的问题,但它可能是相同的基本问题。计算的是纹理边,而不是纹理。
vec2 coords = vec2((s+0.5)/xScale, (t+0.5)/yScale)