在 OpenGL 中使用矩阵——MVP 矩阵不起作用
Posted
技术标签:
【中文标题】在 OpenGL 中使用矩阵——MVP 矩阵不起作用【英文标题】:Using Matrices in OpenGL -- MVP matrix not working 【发布时间】:2015-01-20 04:04:53 【问题描述】:今天我试图按照以下教程进行操作:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/,我觉得我几乎完全按照教程进行操作,但我似乎无法获得相同的结果。我确实使用了一些我定义的类来帮助处理基本操作,但这些并没有错,因为我以前使用过它们。
目前的结果是什么——我在任何地方都看不到三角形。如果我去掉了 vert shader 的 MVP * 部分,那么它就可以工作了
很多代码都是从教程中复制粘贴过来的。
我已经排除的问题: 1. 设置错误(我下载并编译了教程的源代码。) 2. 初始化代码错误(如果将 MVP * 部分从顶点着色器中取出,则可以正常工作)
感谢我能得到的任何帮助。
顶点着色器(Basic.vertexshader):
#version 400 core
layout(location = 0) in vec3 location;
uniform mat4 MVP;
void main()
gl_Position = MVP * vec4(location,1);
// gl_Position = vec4(location, 1); *** this works fine, without the transformations
//coord = texCoord;
这是初始化代码(只调用一次)
glClearColor(0.2f, 0.2f, 0.2f, 1.f);
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
// load program
pro = LoadShaders("Basic.vertexshader", "Basic.fragmentshader");
MVPID = glGetUniformLocation(pro, "MVP");
// Projection matrix : 45° Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
Projection = glm::perspective(45.0f, 4.f / 3.f, 0.1f, 100.f);
// Or, for an ortho camera :
//glm::mat4 Projection = glm::ortho(-10.0f,10.0f,-10.0f,10.0f,0.0f,100.0f); // In world coordinates
// Camera matrix
View = glm::lookAt(
glm::vec3(4, 3, 0), // Camera is at (4,3,3), in World Space
glm::vec3(0, 0, 0), // and looks at the origin
glm::vec3(0, 1, 0) // Head is up (set to 0,-1,0 to look upside-down)
);
// Model matrix : an identity matrix (model will be at the origin)
Model = glm::mat4(1.0f);
// Our ModelViewProjection : multiplication of our 3 matrices
// Our ModelViewProjection : multiplication of our 3 matrices
MVP = Projection * View * Model; // Remember, matrix multiplication is the other way around
GLfloat verts[] =
// ---LOCATION----
-1.f, -1.f, 0.f,
1.f, -1.f, 0.f,
0.f, 1.f, 0.f,
;
// init vbo
glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
return 0;
最后是绘制代码(每一帧):
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(pro);
glUniformMatrix4fv(MVPID, 1, GL_FALSE, &MVP[0][0]);
// bind location
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, (void*)0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
如果我遗漏了一些重要的代码,那么可以在这里下载完整的源代码:
https://www.dropbox.com/sh/zb3r85rj7lgfzs2/AADh0nJSVw5dO2fUAJdrnrTua?dl=0
编辑:如果重要的话,我使用的是 Visual Studio 2013 编译器 我要链接的 .lib 文件是 glfw3.lib、opengl32.lib、glew32.lib
【问题讨论】:
【参考方案1】:您正在查看三角形边缘。三角形在 x/y 平面上,因为所有 z 坐标都为零:
GLfloat verts[] =
-1.f, -1.f, 0.f,
1.f, -1.f, 0.f,
0.f, 1.f, 0.f,
;
相机也位于 x/y 平面,并指向原点:
View = glm::lookAt(
glm::vec3(4, 3, 0),
glm::vec3(0, 0, 0),
glm::vec3(0, 1, 0)
);
三角形和相机位于同一平面,变换后三角形退化,不会渲染像素。
最简单的解决方法是通过给它一个非零 z 坐标来将相机位置移动到 x/y 平面之外。例如:
View = glm::lookAt(
glm::vec3(4.0f, 3.0f, 10.0f),
glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 1.0f, 0.0f)
);
【讨论】:
嗯,有道理,明天去看看。谢谢!以上是关于在 OpenGL 中使用矩阵——MVP 矩阵不起作用的主要内容,如果未能解决你的问题,请参考以下文章