GLSL问题:要偏移和返回的坐标会在不同的机器上产生不同的结果

时间:2018-08-14 06:24:01

标签: glsl webgl

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

我基本上要添加两个矩阵或数组。数据映射到大小为7x9的2D纹理。两个输入的大小相同,均为60个float32。我的代码找到的最接近的纹理大小是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);

正确结果示例(被截断)

EXPECTED: type=float32; dims=[3,4,5]; data=[1.0915919542312622,0.04060405492782593,0.16559171676635742

不正确的示例:

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

1 个答案:

答案 0 :(得分:0)

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

因此,现在我要在获得归一化坐标之前为索引添加0.5(我仍然没有科学的理由):

Sub TransposeData()

Dim ws1 As Worksheet
Set ws1 = Worksheets("Sheet1")

Dim DataRange As Range
Dim DataCell As Range
Dim x As Integer
Dim y As Integer
Dim LastRow As Long
x = 0
y = 0

With ws1
LastRow = .Cells.Find(What:="*", After:=.Range("A1"), LookAt:=xlPart, LookIn:=xlFormulas, _
                            SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
End With

Set DataRange = ws1.Range("A1:A" & LastRow)
For Each DataCell In DataRange
    If DataCell.Value <> "" Then
        ws1.Range("C2").Offset(y, x).Value = DataCell.Value
        x = x + 1
        If x = 4 Then
            x = 0
            y = y + 1
        End If
    End If
Next DataCell

End Sub