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