2015-10-15 114 views
1

我一直在關注有關GLM庫的現代OpenGL教程 我正在介紹用於變換模型,定位相機和添加透視圖的矩陣。OpenGL矩陣和着色器混淆

我有一個三角形:

const GLfloat vertexBufferData[] = { 
-1.0f, -1.0f, 0.0f, 
    1.0f, -1.0f, 0.0f, 
    0.0f, 1.0f, 0.0f, 
}; 

我有我的着色器:

GLuint programID = loadShaders("testVertexShader.glsl", 
           "testFragmentShader.glsl"); 

我已經得到了確實沒有轉換的模型矩陣:

glm::mat4 modelMatrix = glm::mat4(1.0f); /* Identity matrix */ 

我有一個相機矩陣:

glm::mat4 cameraMatrix = glm::lookAt(
    glm::vec3(4.0f, 4.0f, 3.0f), /*Camera position*/ 
    glm::vec3(0.0f, 0.0f, 0.0f), /*Camera target*/ 
    glm::vec3(0.0f, 1.0f, 0.0f) /*Up vector*/ 
); 

而且我有一個投影矩陣:

glm::mat4 projectionMatrix = glm::perspective(
90.0f,  /*FOV in degrees*/ 
4.0f/3.0f, /*Aspect ratio*/ 
0.1f,   /*Near clipping distance*/ 
100.0f  /*Far clipping distance*/ 
); 

然後我乘所有矩陣合力得到了三角形的最後矩陣我想提請:

glm::mat4 finalMatrix = projectionMatrix 
         * cameraMatrix 
         * modelMatrix; 

然後我送該矩陣GLSL(我認爲):

GLuint matrixID = glGetUniformLocation(programID, "MVP"); 
glUniformMatrix4fv(matrixID, 1, GL_FALSE, &finalMatrix[0][0]); 

然後我做着色器的東西,我不很明白:

/*vertex shader*/ 
#version 330 core 

in vec3 vertexPosition_modelspace; 
uniform mat4 MVP; 

void main(){ 
vec4 v = vec4(vertexPosition_modelspace, 1); 
gl_Position = MVP * v; 
} 

/*fragment shader*/ 
#version 330 core 
out vec3 color; 

void main(){ 
color = vec3(1, 1, 0); 
} 

一切都編譯並運行,但我看不到三角形。我已經移動了三角形和相機,也許相機指向了錯誤的方向,但沒有成功。在我們引入矩陣之前,我能夠在屏幕上成功獲得三角形,但現在沒有三角形。三角形應該在原點,相機距離原點只有幾個單位,從原點開始。

回答

4

原來,你需要發送矩陣到着色器之後你已經綁定着色器。 換句話說,你叫glUniformMatrix4fv()glUseProgram()

+1

OpenGL是超級有狀態的 - 一些現代的OpenGL封裝庫嘗試在抽象中隱藏更多的狀態以避免這樣的細微問題。如果你在恰當的地方仔細閱讀,那麼wiki通常對於解釋哪些功能會影響哪種狀態非常好,但是嘗試找到可以爲你做到這一點的更高級別的庫更容易。 – bfops

+0

@bfops這是相當無情的。不過,我很享受這方面的知識。 :) –

+0

您可能想查看[Direct State Access](https://www.opengl.org/registry/specs/EXT/direct_state_access.txt)擴展名。它允許你設置東西而不綁定對象。例如,不使用glUniformMatrix4fv,可以使用glProgramUniformMatrix4fv,其中第一個參數是程序標識,而不需要綁定程序。 – mOfl

2

許多事情可能是你的問題 - 嘗試輸出vec4顏色代替,阿爾法明確設置爲1。有一件事我經常做一個全面的檢查是有頂點着色器忽略所有輸入,並直接輸出頂點,例如是這樣的:。

void main(){ 
    if (gl_VertexID == 0) { 
    gl_Position = vec4(-1, -1, 0, 1); 
    } else if (gl_VertexID == 1) { 
    gl_Position = vec4(1, -1, 0, 1); 
    } else if (gl_VertexID == 2) { 
    gl_Position = vec4(0, 1, 0, 1); 
    } 
} 

如果這樣的作品,那麼你可以嘗試將你的頂點位置輸入回到如果這樣的作品,你可以添加你的相機或投影矩陣回來,等

更一般地,刪除東西,直到某些東西有效,並且你明白它爲什麼起作用,然後再添加部分,直到你停止理解爲什麼事情不起作用。很多時候我已經被一個符號或者乘法次序排除了。