2012-11-16 32 views
0

我使用python OpenGL綁定,並試圖只使用現代opengl調用。我有一個具有verticies的VBO,並且我正在嘗試使用傳遞給頂點着色器的正交投影矩陣進行渲染。原始屏幕左下角的正投影

目前我計算我用下列值投影矩陣:

from numpy import array 

w = float(width) 
h = float(height) 
n = 0.5 
f = 3.0 

matrix = array([ 
        [2/w,  0,  0,  0], 
        [ 0,  2/h,  0,  0], 
        [ 0,  0, 1/(f-n), -n/(f-n)], 
        [ 0,  0,  0,  1], 
       ], 'f') 


#later 
projectionUniform = glGetUniformLocation(shader, 'projectionMatrix') 
glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix) 

該代碼我從這裏得到:

Formula for a orthogonal projection matrix?

這似乎很好地工作,但我想我的原點位於屏幕的左下角。這是一個函數,我可以在我的矩陣上應用,所以一切都「正常」,或者我必須手動翻譯每個對象的w/2 h/2嗎?

備註:座標是否與像素位置匹配,並且此功能正常工作?

因爲我使用現代OpenGL技術,我不認爲我應該使用gluOrtho2d或GL_PROJECTION調用。

回答

1

我對預測尚未完全熟悉,因爲我最近剛剛開始使用OpenGL編程,但您當前的矩陣並未翻譯任何要點。對角線將應用縮放,但最右邊的列將應用平移。 Dirk給出的鏈接爲您提供了一個投影矩陣,它將使您的原點(0,0是您想要的,是嗎?)屏幕的左下角。

我使用這樣做(每個行實際上是一個列的OpenGL)的矩陣:

OrthoMat = mat4(
     vec4(2.0/(screenDim.s - left), 0.0, 0.0, 0.0), 
     vec4(0.0, 2.0/(screenDim.t - bottom),  0.0, 0.0), 
     vec4(0.0, 0.0, -1 * (2.0/(zFar - zNear)), 0.0), 
     vec4(-1.0 * (screenDim.s + left)/(screenDim.s - left), -1.0 * (screenDim.t + bottom)/(screenDim.t - bottom), -1.0 * (zFar + zNear)/(zFar - zNear), 1.0) 
); 

的screenDim數學是有效的寬度或高度,因爲左側和底部都設置爲0 zFar和zNear分別是1和-1(因爲它是2D的,它們並不是非常重要)。

該矩陣以像素爲單位獲取值,並且頂點位置也需要以像素爲單位。當您調整屏幕大小時,點(0,32)將始終處於相同的位置。

希望這會有所幫助。

編輯#1:要清楚,我說的左/底/ zfar/znear值是選擇使他們。你可以改變你看起來合適的方式。

+0

非常感謝你的例子Alex。通過結合這一點,和我混合了GL_FALSE,一切都按預期工作! – Shootfast

1

您可以使用更一般的投影矩陣,它還使用左右位置。

請參閱Wikipedia的定義。

1
glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix) 

您的矩陣以行優先順序存儲。所以你應該通過GL_TRUE,或者你應該改變你的矩陣爲專業。

+0

感謝您發現尼科爾。關於如何將原點移動到左下角的任何想法? – Shootfast