我有一个小段,生成一个如下所示的显示列表:
glNewList ( CDisplayList :: GetBaseList () + 2, GL_COMPILE );
{
glBegin ( GL_QUADS );
glPushMatrix ();
//
// Move to slightly lower position.
//
glTranslatef ( 0.0f, -1.1f, 0.0f );
glColor4f ( 1.0f, 1.0f, 1.0f, 1.0f );
//
// Front facing.
//
glTexCoord2f ( m_TexLeft, m_TexBottom ); glVertex3f ( m_Start, -0.1f, 0.0f );
glTexCoord2f ( m_TexRight, m_TexBottom ); glVertex3f ( m_End, -0.1f, 0.0f );
glTexCoord2f ( m_TexRight, m_TexTop ); glVertex3f ( m_End, -1.3f, 0.0f );
glTexCoord2f ( m_TexLeft, m_TexTop ); glVertex3f ( m_Start, -1.3f, 0.0f );
//
// Back facing.
//
glTexCoord2f ( m_TexLeft, m_TexTop ); glVertex3f ( m_Start, -1.3f, 0.0f );
glTexCoord2f ( m_TexRight, m_TexTop ); glVertex3f ( m_End, -1.3f, 0.0f );
glTexCoord2f ( m_TexRight, m_TexBottom ); glVertex3f ( m_End, -0.1f, 0.0f );
glTexCoord2f ( m_TexLeft, m_TexBottom ); glVertex3f ( m_Start, -0.1f, 0.0f );
glPopMatrix ();
glEnd ();
}
glEndList ();
GLenum e = glGetError();
此处末尾的“e”值始终为1282(无效操作,或类似的操作)。我不知道为什么。构建列表的每个命令之后我都检查了glGetError,从glNewList向下,它总是相同的(零)。此显示列表是之前构建好的3 - 2之一(使用glGetError测试并返回零)。所以关于这个清单的具体内容让驾驶员头疼。
有什么想法吗?
注意m_TexLeft等是0,0,1,0.125(左,上,右,下)和m_Start,m_End是0,100。GetBaseList通过调用glGenLists(3)返回一个整数(确切的)价值是257)。
说实话,看不出它有什么问题。
答案 0 :(得分:5)
您需要将转换矩阵操作移出glBegin / glEnd对。这就是documentation所说的:
glBegin和glEnd之间只能使用GL命令的子集。 命令是glVertex,glColor,glIndex,glNormal,glTexCoord, glEvalCoord,glEvalPoint,glArrayElement,glMaterial和glEdgeFlag。 此外,可以使用glCallList或glCallLists来执行 显示仅包含上述命令的列表。如果有的话 GL命令在glBegin和glEnd之间执行,错误标志是 设置,命令被忽略。
在错误部分:
如果glVertex以外的命令生成GL_INVALID_OPERATION, glColor,glIndex,glNormal,glTexCoord,glEvalCoord,glEvalPoint, glArrayElement,glMaterial,glEdgeFlag,glCallList或glCallLists是 在执行glBegin和相应的执行之间执行 执行glEnd。