3
我試圖在GLSL中將齊列mat4
列vec3
表示的點轉換爲點。該矩陣是沿x軸簡單平移1。我檢查是最好的,我所能說的矩陣的確讓我着色器這種形式的適當列主要矩陣:GLSL齊次轉換問題
1 0 0 1
0 1 0 0
0 0 1 0
0 0 0 1
我第一次嘗試(matrix * vec4(point, 1)).xyz
,但是我沒有看到的效果翻譯在我的場景中。在某種程度上,絕望之後,我以不同的方式重新實現了這種轉變,這種轉變看起來與我相當,並且找到了一個做我想做的事情。然而,我在虧損找出爲什麼只有一個工作:
#version 140
vec3 transformPoint(vec3 point, mat4 matrix)
{
return (matrix * vec4(point, 1)).xyz;
return mat3(matrix[0].xyz, matrix[1].xyz, matrix[2].xyz) * point
+ matrix[3].xyz;
return matrix[0].xyz * point.x
+ matrix[1].xyz * point.y
+ matrix[2].xyz * point.z
+ matrix[3].xyz;
// This works, but is not a full transformation
return point + matrix[3].xyz;
// Only this one works
matrix = transpose(matrix);
return vec3(
dot(matrix[0], vec4(point, 1)),
dot(matrix[1], vec4(point, 1)),
dot(matrix[2], vec4(point, 1)));
}
古怪,非工作轉換有效果,如果我用一個Y平移,但沒有上的X平移。
我希望我只是忽略了一些明顯的東西。有任何想法嗎?
更新:
我做了一些更多的測試和vector * transpose(matrix)
不會產生相同的結果爲matrix * vector
。這是怎麼回事?
你在測試什麼GPU?我在Qualcomm Adreno 320做矩陣後置乘法時遇到了一些不好的結果。 – nmr
@nmr嗯,這已經有一段時間了,但它是GeForce 525M或Intel HD 4400 GPU。 – Trillian