我在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)为中心的令人敬畏的红色球体。如果我修改半径,球体将改变其尺寸。
我已经检查了很多遍代码,并且在Google上几乎没有关于如何使用GLUT绘制实体的任何结果,但是找不到我的问题的答案。另外,我尝试通过两次调用函数来绘制两个球体,分别给出两个不同的位置和两种不同的颜色。绘制了两个球体,但是它们都是红色的,并且居中于(0,0,0),如您在此屏幕快照中所见:
由于我还使用了带有顶点和片段着色器的VAO,VBO和EBO来绘制其他内容,所以这可能是一个问题吗?可能是GLUT和GLFW之间的兼容性问题吗?我该怎么做才能解决此问题?
编辑:感谢@ Rabbid76,我设法使用glUseProgram(0)
解决了位置问题,而glBindVertexArray(0)
似乎根本没有影响程序的行为。不过,现在我仍然面临另一个问题:由于我使用着色器绘制了所有内容,因此我还需要处理一个模型矩阵,一个视图矩阵和一个投影矩阵。当我使用gl管道绘制球体时,它显示在摄影机视觉效果的一角:
以及我用相机进行的任何移动(使用鼠标和键盘),球体将保持在该位置(在相机POV中)。我认为这是由于我绘制对象的方式不同而发生的,但是我不知道如何使用gl管道命令将球体设置到正确的位置。我能做什么?是否有某种有用的指南或教程可以使工作正常进行?
答案 0 :(得分:3)
[...]我还有一个模型矩阵,一个视图矩阵和一个投影矩阵要处理。 [...]我不知道如何使用gl管道命令将球体设置到正确的位置。 [...]
在Legacy OpenGL中,由glVertexPointer
指定的固定函数坐标属性(分别由glVertex
设置的顶点corodinate)由当前的模型视图矩阵({{ 1}})和当前的投影矩阵(sub(/\.[^.\/]*$/, "", $2)
)。
如果您设置了4x投影和(模型)视图矩阵,则可以通过glLoadMatrix
将这些矩阵加载到当前矩阵。该矩阵必须由指向16个连续值的指针提供,这些值用作4x4列主矩阵的元素。
可以通过glMatrixMode
选择当前矩阵(类型)。
在通过GL_MODELVIEW
梳理几何图形之前,加载投影和(模型)视图矩阵。例如:
GL_PROJECTION