我偶然发现了我无法解释的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矩阵的代码不会在屏幕上绘制任何内容。
答案 0 :(得分:5)
您无法在glPushMatrix()/PopMatrix()
阻止内召唤glBegin()/glEnd()
。
glBegin和glEnd之间只能使用GL命令的子集。 命令是glVertex,glColor,glSecondaryColor,glIndex, glNormal,glFogCoord,glTexCoord,glMultiTexCoord,glVertexAttrib, glEvalCoord,glEvalPoint,glArrayElement,glMaterial和glEdgeFlag。 此外,可以使用glCallList或glCallLists来执行 显示仅包含上述命令的列表。如果有的话 GL命令在glBegin和glEnd之间执行,错误标志是 设置,命令被忽略。
建议:使用vertex arrays或vertex buffer objects代替经典的立即模式glBegin()/glEnd()
块。
答案 1 :(得分:2)
这里有几个问题。首先,你不能将矩阵运算与顶点运算混合 - 我假设这是简写并且你跳过了glBegin()/ glEnd()。但主要问题是你在翻译前在原点发送了顶点。反转这两行,你应该得到想要的结果。
答案 2 :(得分:-1)
你很接近,但我认为你应该在你的第一个片段中交换glVertex / glTranslate的顺序。
当你调用glVertex时,它是使用堆栈顶部的当前矩阵绘制的。调用translate仅影响后续顶点的绘制;你不能移动已经提交的顶点。