这让我很头疼有一段时间了。我正在尝试使用
glm::lookAt
但似乎无法正确编写它。我正在使用 Opengl 330 核心。这是我的代码:
这就是我要画的物体:
float microwave[] = {
// x y r g b a nx ny nz
-0.7, -0.7, 0.0, 0.75, 0.75, 0.75, 1.0, 0.0, 0.0, 1.0, // left bottom
-0.7, 0.7, 0.0, 0.75, 0.75, 0.75, 1.0, 0.0, 0.0, 1.0, // left up
0.7, -0.7, 0.0, 0.75, 0.75, 0.75, 1.0, 0.0, 0.0, 1.0, // right bottom
0.7, 0.7, 0.0, 0.75, 0.75, 0.75, 1.0, 0.0, 0.0, 1.0 // right up
};
这就是我的设置方式:
unsigned int stride = (3 + 4 + 3) * sizeof(float);
glBindVertexArray(VAO[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(microwave), microwave, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, stride, (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, stride, (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, stride, (void*)(7 * sizeof(float)));
glEnableVertexAttribArray(2);
这就是我画的方式:
// drawing microwave
glBindVertexArray(VAO[0]);
glDrawArrays(GL_TRIANGLE_STRIP, 0, sizeof(microwave) / stride);
这就是我定义视图矩阵的方式:
glm::mat4 view = glm::mat4(1.0f);
view = glm::lookAt(glm::vec3(0.f, 0.0f, 5.0f), glm::vec3(0, 0, 0), glm::vec3(0, 0, 1));;
unsigned int viewLoc = glGetUniformLocation(basicShader, "uV");
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
这是在顶点着色器中的
main
:
gl_Position = uV * vec4(inPos.x, inPos.y, inPos.z, 1.0);
如果
view
是单位矩阵,那么一切都可以正常工作,因此传递制服就可以了。我不知道会出现什么问题。看起来很简单。
我试图更改 eye
、object location
和 up
向量,但没有任何效果。我做错了什么?
我有更多的代码和更多的对象,但我认为这足以定位问题。如果没有,请询问您需要什么。
我会设置一些键绑定,以便您可以在程序中修改这些变量,以便更好地了解它们是如何工作的(修改它们时登录到控制台)。
有一个非常简单易懂的教程:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/
设置它,尝试一下以获得更好的直觉,然后回到你的代码,你会有一个更好的想法。