2013-11-24 57 views
3

我試圖在GLSL中將齊列mat4vec3表示的點轉換爲點。該矩陣是沿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。這是怎麼回事?

+0

你在測試什麼GPU?我在Qualcomm Adreno 320做矩陣後置乘法時遇到了一些不好的結果。 – nmr

+0

@nmr嗯,這已經有一段時間了,但它是GeForce 525M或Intel HD 4400 GPU。 – Trillian

回答

1

沒有關於如何在調用transformPoint()之前初始化mat4變量的附加信息。我猜測你傳入的矩陣很可能是行主要的順序,而默認情況下的glsl的矩陣都是主要的列。這解釋了爲什麼它只在轉置(矩陣)之後才起作用。