嗨,我開始將我的一個項目從固定管道移開,所以嘗試一下,我嘗試着寫一個着色器,它只是簡單地傳遞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%積極的這些矩陣是正確的,然後我通過他們順便說一句)任何想法?
爲什麼你檢索OpenGL的矩陣,然後將它們傳遞迴嗎?是的,OpenGL-3核心降低了基礎數學函數的功能,但不是爲了讓你實現一些環回。你應該自己做數學或者使用專門的矩陣數學庫。 – datenwolf 2011-04-11 17:00:50
OpenGL狀態機與固定功能管道無關。此外,使用可編程着色器代替固定功能OpenGL仍然是一個狀態機(在這種情況下,綁定着色器,紋理和緩衝區定義GL狀態)。 – datenwolf 2011-04-11 17:01:49
矩陣順序在第二個版本中是錯誤的。應該是'projection * modelview * vertex'。 – ltjax 2011-04-11 17:05:28