glPushMatrix里面的显示列表重复模型

时间:2012-07-11 19:41:03

标签: opengl displaylist

我有一些立方体的显示列表......非常简单的东西。这是一个片段:

GL11.glPushMatrix
GL11.glRotatef(90,0,0,1)
cuboid(1,0.5,20) //just glVertex calls
GL11.glPopMatrix

如果我使用它来立即模式绘制没有奇怪的事情发生。但是,如果我将它放在显示列表中,它将首先绘制未旋转的长方体然后旋转(或者我在glPushMatrix和glPopMatrix之间进行的任何转换)。此外,如果我不使用glPush和glPop,它的行为与预期一致。

在显示列表中使用glPush / PopMatrix时,我需要知道一些事情吗?

编辑:添加更多源代码:

handle = GL11.glGenLists(1);
GL11.glNewList(handle,GL11.GL_COMPILE)
GL11.glBegin(GL11.GL_LINES);

GL11.glPushMatrix //if I don't use these it behaves as expected
GL11.glRotatef(90,0,0,1)
cuboid(1,0.5,20) //just glVertex calls
GL11.glPopMatrix

GL11.glEnd();
GL11.glEndList();

EDIT2:我已经通过glPushMatrix和glEnd与glPopMatrix交换glBegin来实现它 - 我不喜欢它现在看起来如何,但至少它是有效的。据我所知,这不正常,我所做的只是一个技巧,所以我将问题保持开放。

GL11.glPushMatrix //everytime I want to push/pop I have to call glBegin and glEnd
GL11.glBegin(GL11.GL_LINES);
GL11.glRotatef(90,0,0,1)
cuboid(1,0.5,20) //just glVertex calls
GL11.glEnd();
GL11.glPopMatrix

1 个答案:

答案 0 :(得分:5)

在glBegin / glEnd中调用glPushMatrix是错误的。只有一个严格的命令子集可以在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命令,               错误标志已设置,命令将被忽略。

在glPushMatrix的手册页上:

  

如果glPushMatrix或glPopMatrix,则生成GL_INVALID_OPERATION               在执行glBegin之间执行               以及glEnd的相应执行。

开始在开发代码中加入glGetError,它会向你指出这些问题。

glRotatef也不合法:

  

如果glRotate,则生成GL_INVALID_OPERATION               在执行glBegin之间执行               以及glEnd的相应执行。