我有一个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,...
答案 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