2

我在 OpenGL 中偶然发现了一个我无法解释的问题,除非我以某种方式误解了glPushMatrix()/是如何glPopMatrix()工作的。

下面的两段代码不应该有完全相同的效果吗?

  glPushMatrix();
  glVertex3f(0,0,0);
  glTranslatef(c->e->coords[0], c->e->coords[1], c->e->coords[2]);
  glPopMatrix();

对比

  glVertex3f(c->e->coords[0], c->e->coords[1], c->e->coords[2]);

在我的应用程序中,只有当我使用第二个时,我才能看到任何东西。我尝试在代码中完全相同的位置使用两段代码,没有改变任何其他内容,而带有推送/弹出矩阵的代码不会在屏幕上绘制任何内容。

4

3 回答 3

5

您不能glPushMatrix()/PopMatrix()glBegin()/glEnd()块内调用。

glBegin()

在 glBegin 和 glEnd 之间只能使用 GL 命令的子集。这些命令是 glVertex、glColor、glSecondaryColor、glIndex、glNormal、glFogCoord、glTexCoord、glMultiTexCoord、glVertexAttrib、glEvalCoord、glEvalPoint、glArrayElement、glMaterial 和 glEdgeFlag。此外,可以使用 glCallList 或 glCallLists 来执行仅包含上述命令的显示列表。如果在 glBegin 和 glEnd 之间执行了任何其他 GL 命令,则设置错误标志并忽略该命令。

建议:使用顶点数组顶点缓冲区对象而不是经典的立即模式glBegin()/glEnd()块。

于 2012-06-14T21:13:13.377 回答
2

这里有几个问题。首先,您不能将矩阵运算与顶点运算混合在一起——我假设这是速记并且您跳过了 glBegin()/glEnd()。但主要问题是您在翻译之前在原点发送了顶点。颠倒这两行,你应该得到想要的结果。

于 2012-06-14T21:28:55.357 回答
-1

你很接近,但我认为你应该在你的第一个片段中交换 glVertex/glTranslate 的顺序。

当您调用 glVertex 时,它会使用堆栈顶部的当前矩阵进行绘制。调用 translate 仅影响绘制的后续顶点;您不能移动已提交的顶点。

于 2012-06-14T21:12:18.780 回答