adr*_*on3 1 opengl displaylist
我有一些立方体的显示列表......非常简单的东西.这是一个片段:
GL11.glPushMatrix
GL11.glRotatef(90,0,0,1)
cuboid(1,0.5,20) //just glVertex calls
GL11.glPopMatrix
Run Code Online (Sandbox Code Playgroud)
如果我使用它来立即模式绘制没有奇怪的事情发生.但是,如果我将它放在显示列表中,它将首先绘制未旋转的长方体然后旋转(或者我在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();
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
在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.
| 归档时间: |
|
| 查看次数: |
778 次 |
| 最近记录: |