Opengl 旋转不起作用

森纳姆

我试着理解 opengl,但我有很多简单的问题......我尝试旋转我的对象,我正在这样做:

glBindVertexArray(VAOs[1]);
glBindTexture(GL_TEXTURE_2D, texture1);
glActiveTexture(GL_TEXTURE1);
glUniform1i(glGetUniformLocation(theProgram.get_programID(), "Texture1"), 1);

glMatrixMode(GL_MODELVIEW_MATRIX);
glPushMatrix();
glRotatef(10.0f, 0.0f, 0.0f, -0.1f);
glDrawElements(GL_TRIANGLES, _countof(tableIndices2), GL_UNSIGNED_INT, 0);
glPopMatrix();

而我的对象仍然在相同的位置。怎么了?

疯兔76

类似glRotate函数是已弃用的 See Fixed Function Pipeline 的一部分此函数不影响着色器程序处理的顶点。

参见Khronos wiki - Legacy OpenGL

2008 年,发布了 OpenGL 规范的 3.0 版。在这次修订中,Fixed Function Pipeline以及大多数相关的 OpenGL 函数和常量被宣布弃用。这些已弃用的元素和概念现在通常称为旧版 OpenGL。...

请参阅Khronos wiki - 固定功能管道

OpenGL 3.0 是规范的最后一个修订版,它完全支持固定和可编程功能。即便如此,自 OpenGL 2.0 代以来的大多数硬件都缺乏实际的固定功能硬件。相反,固定功能进程使用系统构建的着色器进行模拟。...


在现代 OpenGL 中,你必须自己做这些事情。

如果您从 Fixed Function Pipeline 切换到今天的 OpenGL(在 C++ 中),那么我建议使用glm OpenGL Mathematics 之类的库进行矩阵运算。

首先,您必须创建一个具有矩阵统一的顶点着色器,并且必须在顶点着色器中对顶点坐标和模型矩阵进行乘法运算:

in vec3 vert_pos;

uniform mat4 model_matrix;

void main()
{
    gl_Position = model * vec4(vert_pos.xyz, 1.0);
}

当然,您可以声明更多矩阵,如投影矩阵和视图矩阵:

in vec3 vert_pos;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    gl_Position = projection * view * model * vec4(vert_pos.xyz, 1.0);
}

在 C++ 代码中,您必须设置矩阵,并且必须设置矩阵统一:

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp> // glm::rotate
#include <glm/gtc/type_ptr.hpp>         // glm::value_ptr


glm::mat4 modelMat = glm::rotate(
    glm::mat4(1.0f),
    glm::radians(10.0f),
    glm::vec3(0.0f, 0.0f, -1.0f) );

GLint model_loc = glGetUniformLocation(theProgram.get_programID(), "model");

glUniformMatrix4fv(model_loc, 1, GL_FALSE, glm::value_ptr(modelMat)); 

另请参阅glm 矩阵转换的文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章