我有一些立方体的显示列表......非常简单的东西。这是一个片段:
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
答案 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的相应执行。