2015-04-07 161 views
0

我想要爲我的GUI渲染使用正射投影。當我使用我的常規變換矩陣繪製網格時,我得到了我期望的結果,但是當我使用正交投影時,我什麼也得不到。我的透視投影也很好。我的正矩陣:OpenGL:正投影

public Matrix4f initOrthographic(float left, float right, float bottom, float top, float near, float far) 
{ 
    m[0][0] = 2.0f/(right - left); m[0][1] = 0;      m[0][2] = 0;     m[0][3] = (left + right)/(left - right); 
    m[1][0] = 0;      m[1][1] = 2.0f/(top - bottom); m[1][2] = 0;     m[1][3] = (bottom + top)/(bottom - top); 
    m[2][0] = 0;      m[2][1] = 0;      m[2][2] = 2.0f/(near - far); m[2][3] = (far + near)/(far - near); 
    m[3][0] = 0;      m[3][1] = 0;      m[3][2] = 0;     m[3][3] = 1; 

    return this; 
} 

我不能爲我的生活找出什麼是錯的。我將這個矩陣乘以正則變換,然後將該矩陣乘以着色器中的頂點位置。有任何想法嗎?如果需要,我可以發佈更多的代碼/信息。

我想我只是發現了這個問題。我在頂部0和底部720,當我把這些值翻到720頂部和0底部它工作得很好。唯一的是我想左上角是(0,0)。有沒有什麼辦法可以做到這一點,或者我堅持左下角是(0,0)?

+1

看起來您的矩陣按行排列,而列主矩陣通常用於OpenGL。 –

+0

我所有的其他矩陣都是以這種方式完成的,它們工作得很好。對不起,如果我不完全理解,我不知道我在做矩陣時做了什麼。 – redonkulasman

+0

你有沒有考慮檢查你的視口設置? –

回答

1

我的正交矩陣看起來相當不同,你的:

 2.0f/(right - left)       0         0      0 
       0       2.0f/(top - bottom)       0      0 
       0         0       2.0f/(zFar - zNear)   0 
-(right + left)/(right - left)  -(top + bottom)/(top - bottom) -(zFar + zNear)/(zFar - zNear)  1 

重要的是你如何存儲的值。如果你想使用一個float數組爲你的矩陣,你將它保存這樣的:

float orthoMat[] = 
{ 
    2.0f/(right - left), 
    0, 
    0, 
    0, 

    0, 
    2.0f/(top - bottom), 
    0, 
    0, 

    0, 
    0, 
    2.0f/(zFar - zNear), 
    0, 

    -(right + left)/(right - left), 
    -(top + bottom)/(top - bottom), 
    -(zFar + zNear)/(zFar - zNear), 
    1 
}; 

這是OpenGL的希望您能傳遞到shader佈局。這是列主要的約定。 DirectX使用行主要約定。所以基本上我的矩陣可以從左到右,從左到右閱讀,而矩陣應該從上到下,下一列,從上到下閱讀。如果你轉換你的矩陣,你會得到和我幾乎相同的矩陣。然而,有我們的矩陣之間的一些差異,調換甚至當:

在你的代碼

- m[2][2] should be 2.0f/(zFar - zNear) 
- m[0][3], m[1][3] and m[2][3] should be negative 

只要你解決這些問題與你的矩陣,並確保元素的正確順序的矩陣傳遞到時着色器,你仍然可以使用你的矩陣實現。請記住,元素12,13和14存儲翻譯。如果您對所有這些行 - 主要/列 - 主要的東西感到困惑,請閱讀this關於它的簡短文章,它很好地解釋了它。我強烈推薦它。