2011-04-11 54 views
4

嗨,我開始將我的一個項目從固定管道移開,所以嘗試一下,我嘗試着寫一個着色器,它只是簡單地傳遞OpenGL矩陣並將頂點轉換爲然後開始計算我自己,一旦我知道工作。我認爲這將是一個簡單的任務,但即使這樣也行不通。GLSL + OpenGL離開狀態機

我開始了這個shader正常固定管道:

void main(void) 
{ 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
} 

然後我就把它改成了這樣:

uniform mat4 model_matrix; 
uniform mat4 projection_matrix; 

void main(void) 
{ 
    gl_Position = model_matrix * projection_matrix * gl_Vertex; 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
} 

我然後檢索OpenGL的矩陣是這樣,並將它們傳遞到shader與此代碼:

[material.shader bindShader]; 

GLfloat modelmat[16]; 
     GLfloat projectionmat[16]; 

     glGetFloatv(GL_MODELVIEW_MATRIX, modelmat); 
     glGetFloatv(GL_PROJECTION_MATRIX, projectionmat); 


     glUniformMatrix4fv([material.shader getUniformLocation:"model_matrix"], 1, GL_FALSE, modelmat); 
     glUniformMatrix4fv([material.shader getUniformLocation:"projection_matrix"], 1, GL_FALSE, projectionmat); 
... Draw Stuff 

由於某種原因,這並沒有畫任何東西(我95%積極的這些矩陣是正確的,然後我通過他們順便說一句)任何想法?

+0

爲什麼你檢索OpenGL的矩陣,然後將它們傳遞迴嗎?是的,OpenGL-3核心降低了基礎數學函數的功能,但不是爲了讓你實現一些環回。你應該自己做數學或者使用專門的矩陣數學庫。 – datenwolf 2011-04-11 17:00:50

+1

OpenGL狀態機與固定功能管道無關。此外,使用可編程着色器代替固定功能OpenGL仍然是一個狀態機(在這種情況下,綁定着色器,紋理和緩衝區定義GL狀態)。 – datenwolf 2011-04-11 17:01:49

+3

矩陣順序在第二個版本中是錯誤的。應該是'projection * modelview * vertex'。 – ltjax 2011-04-11 17:05:28

回答

2

問題是我的矩陣乘法的順序是錯誤的。我不知道這些操作是不可交換的。

正確的順序應該是:

projection * modelview * vertex 

感謝ltjax和doug65536

2

對於矩陣運算,請嘗試使用外部庫,例如GLM。他們也有一些基本的examples關於如何創建必要的矩陣和做投影*視圖*模型轉換。

0

使用OpenGL 3.3的着色語言。硬件方面,OpenGL 3.3與DirectX10大致相當。

請勿使用棄用的功能。第一個void main示例中的幾乎所有內容都已棄用。如果您希望使用驅動程序的高性能代碼路徑,則必須明確聲明您的輸入和輸出。不推薦使用的功能也更有可能充滿驅動程序錯誤。

使用更新,更明確的風格聲明輸入和輸出,並將它們設置在您的代碼中。這真的不壞。我認爲這會很難看,但實際上很簡單(我希望我早些時候做過)。僅供參考,我上次查看OpenGL(2012)的最低公分母時,是OpenGL 3.3。幾乎所有具有任何遊戲功能的AMD和NVidia的顯卡都將擁有OpenGL 3.3。而且他們已經有一段時間了,所以現在爲OpenGL 3.3編寫的任何代碼都適用於典型的低端GPU或更好的GPU。