我对OpenGL push / pop矩阵的理解是错误的吗?

时间:2012-06-14 21:06:14

标签: opengl matrix drawing translation

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

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

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

VS

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

在我的应用程序中,只有当我使用第二个时才会看到任何内容。我尝试在代码中完全相同的位置使用两段代码,不做其他更改,而使用push / pop矩阵的代码不会在屏幕上绘制任何内容。

3 个答案:

答案 0 :(得分: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来执行   显示仅包含上述命令的列表。如果有的话   GL命令在glBegin和glEnd之间执行,错误标志是   设置,命令被忽略。

建议:使用vertex arraysvertex buffer objects代替经典的立即模式glBegin()/glEnd()块。

答案 1 :(得分:2)

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

答案 2 :(得分:-1)

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

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