为什么glColor3f()和glTranslated()不影响对象的创建?

时间:2019-09-23 11:40:12

标签: c++ opengl glut glfw opengl-compat

我在GLFW上下文中使用GLUT绘制了一个球体。我使用的代码是:

void drawSphere(std::vector<GLfloat> color, std::vector<GLdouble> position, float radius) {

    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    glColor3f(color[0], color[1], color[2]);
    glPushMatrix();
    glTranslated(position[0], position[1], position[2]);
    glutSolidSphere(radius, 50, 50);
    glPopMatrix();
}

我在main()函数循环中调用它,看起来像这样:

while(!glfwWindowShouldClose(window)) {
    // other stuff...
    drawSphere({(GLfloat)1.0, (GLfloat)1.0, (GLfloat)1.0}, {(GLdouble)2.0, (GLdouble)2.0, (GLdouble)2.0}, 1.0);
    // other stuff...
    glfwSwapBuffers(window);
    glfwPollEvents();
}

但是,无论我指定什么颜色或指定什么位置,我都会得到一个以(0,0,0)为中心的令人敬畏的红色球体。如果我修改半径,球体将改变其尺寸。

Single sphere

我已经检查了很多遍代码,并且在Google上几乎没有关于如何使用GLUT绘制实体的任何结果,但是找不到我的问题的答案。另外,我尝试通过两次调用函数来绘制两个球体,分别给出两个不同的位置和两种不同的颜色。绘制了两个球体,但是它们都是红色的,并且居中于(0,0,0),如您在此屏幕快照中所见:

Inside the bigger sphere

由于我还使用了带有顶点和片段着色器的VAO,VBO和EBO来绘制其他内容,所以这可能是一个问题吗?可能是GLUT和GLFW之间的兼容性问题吗?我该怎么做才能解决此问题?

编辑:感谢@ Rabbid76,我设法使用glUseProgram(0)解决了位置问题,而glBindVertexArray(0)似乎根本没有影响程序的行为。不过,现在我仍然面临另一个问题:由于我使用着色器绘制了所有内容,因此我还需要处理一个模型矩阵,一个视图矩阵和一个投影矩阵。当我使用gl管道绘制球体时,它显示在摄影机视觉效果的一角:

Camera visual issue

以及我用相机进行的任何移动(使用鼠标和键盘),球体将保持在该位置(在相机POV中)。我认为这是由于我绘制对象的方式不同而发生的,但是我不知道如何使用gl管道命令将球体设置到正确的位置。我能做什么?是否有某种有用的指南或教程可以使工作正常进行?

1 个答案:

答案 0 :(得分:3)

  

[...]我还有一个模型矩阵,一个视图矩阵和一个投影矩阵要处理。 [...]我不知道如何使用gl管道命令将球体设置到正确的位置。 [...]

Legacy OpenGL中,由glVertexPointer指定的固定函数坐标属性(分别由glVertex设置的顶点corodinate)由当前的模型视图矩阵({{ 1}})和当前的投影矩阵(sub(/\.[^.\/]*$/, "", $2))。

如果您设置了4x投影和(模型)视图矩阵,则可以通过glLoadMatrix将这些矩阵加载到当前矩阵。该矩阵必须由指向16个连续值的指针提供,这些值用作4x4列主矩阵的元素。
可以通过glMatrixMode选择当前矩阵(类型)。

在通过GL_MODELVIEW梳理几何图形之前,加载投影和(模型)视图矩阵。例如:

GL_PROJECTION