我一直在关注有关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