1

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

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:我通过将 glBegin 与 glPushMatrix 和 glEnd 与 glPopMatrix 交换来使其工作 - 我不喜欢它现在的样子,但至少它可以工作。据我所知,这是不正常的,我所做的只是一个把戏,所以我把这个问题留了下来。

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
4

1 回答 1

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 的手册页上:

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

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

glRotatef 在那里也不合法:

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

于 2012-07-12T06:09:58.717 回答