我一直在關注有關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);
}
一切都編譯並運行,但我看不到三角形。我已經移動了三角形和相機,也許相機指向了錯誤的方向,但沒有成功。在我們引入矩陣之前,我能夠在屏幕上成功獲得三角形,但現在沒有三角形。三角形應該在原點,相機距離原點只有幾個單位,從原點開始。
OpenGL是超級有狀態的 - 一些現代的OpenGL封裝庫嘗試在抽象中隱藏更多的狀態以避免這樣的細微問題。如果你在恰當的地方仔細閱讀,那麼wiki通常對於解釋哪些功能會影響哪種狀態非常好,但是嘗試找到可以爲你做到這一點的更高級別的庫更容易。 – bfops
@bfops這是相當無情的。不過,我很享受這方面的知識。 :) –
您可能想查看[Direct State Access](https://www.opengl.org/registry/specs/EXT/direct_state_access.txt)擴展名。它允許你設置東西而不綁定對象。例如,不使用glUniformMatrix4fv,可以使用glProgramUniformMatrix4fv,其中第一個參數是程序標識,而不需要綁定程序。 – mOfl