2011-02-23 52 views
8

我開始使用GLM庫來完成OpenGL 3和GLSL的數學運算。 我需要一個正投影繪製2D圖形,所以我所著這個簡單的代碼:屏幕上的glm中矩陣值的順序錯誤?

glm::mat4 projection(1.0); 
projection = glm::ortho(0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 500.0f); 

打印的GLM ::鄰創造了價值,我得到:

0.00313 0.00000 0.00000 0.00000 
0.00000 -0.00417 0.00000 0.00000 
0.00000 0.00000 -0.00200 0.00000 
-1.00000 1.00000 -1.00000 1.00000 

據我所知這不是OpenGL中值的正確順序,因爲將該矩陣乘以位置向量將忽略所有翻譯值。

我用我的着色器和一些原語測試了這個矩陣,我只得到一個空白屏幕。但是,如果我手動修改矩陣爲它工作的很好:

0.00313 0.00000 0.00000 -1.00000 
0.00000 -0.00417 0.00000 1.00000 
0.00000 0.00000 -0.00200 -1.00000 
0.00000 0.00000 0.00000 1.00000 

而且,看功能「鄰」,在「GLM/GTC/matrix_transform.inl」文件:

template <typename valType> 
inline detail::tmat4x4<valType> ortho(
    valType const & left, 
    valType const & right, 
    valType const & bottom, 
    valType const & top, 
    valType const & zNear, 
    valType const & zFar) 
{ 
    detail::tmat4x4<valType> Result(1); 
    Result[0][0] = valType(2)/(right - left); 
    Result[1][1] = valType(2)/(top - bottom); 
    Result[2][2] = - valType(2)/(zFar - zNear); 
    Result[3][0] = - (right + left)/(right - left); 
    Result[3][1] = - (top + bottom)/(top - bottom); 
    Result[3][2] = - (zFar + zNear)/(zFar - zNear); 
    return Result; 
} 

我已經取代由以下代碼的最後3條初始化線也工作確定:

Result[0][3] = - (right + left)/(right - left); 
    Result[1][3] = - (top + bottom)/(top - bottom); 
    Result[2][3] = - (zFar + zNear)/(zFar - zNear); 

這是我使用的測試(注意,最小的頂點着色器在這一刻uni_MVP只是projecti在上面解釋的矩陣):

uniform mat4 uni_MVP; 

in vec2 in_Position; 

void main(void) 
{ 
    gl_Position = uni_MVP * vec4(in_Position.xy,0.0, 1.0); 
} 

我thik,這不是一個錯誤,因爲所有功能的工作方式相同。 也許是我的C++編譯器的問題,它顛倒了多維數組的順序? 如何在不修改所有GLM源代碼的情況下解決此問題?

我在Windows Vista上使用運行在Code :: Blocks和MinGW上的最新版本的GLM庫(0.9.1)。

回答

22

首先,它被稱爲轉置,而不是倒置。倒置意味着完全不同的東西。其次,這正是它應該如此。 OpenGL的訪問在列優先順序矩陣,即矩陣元素有以下指標:

0 4 8 12 
1 5 9 13 
2 6 10 14 
3 7 11 15 

但是你平時的C/C++多維數組你通常數量是這樣的:

0 1 2 3 
4 5 6 7 
8 9 10 11 
12 13 14 15 

即行和列索引轉置。老版本的OpenGL帶有一些擴展,允許以轉置的形式提供矩陣,以免人們重寫他們的代碼。它被稱爲GL_ARB_transpose_matrixhttp://www.opengl.org/registry/specs/ARB/transpose_matrix.txt

使用着色器,它比使用新功能更容易。 glUniformMatrix有一個參數GLboolean transpose,你有3個猜測它的作用。

+0

謝謝datenwolf!通過更改glUniformMatrix上的轉置參數來修復:) – Dani 2011-02-23 23:48:13