2011-07-25 66 views
1

我有一個生成的顯示列表看起來像這樣一個小片段:OpenGL的錯誤與1282 glEndList()

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(無效操作,或類似的東西)。我不知道爲什麼。每次構建列表的命令後,我都從glNewList向下檢查了glGetError,它始終是相同的(零)。這個顯示列表是之前建立的3 - 2中的一個(用glGetError進行測試並返回零)。所以關於這個清單的一些事情特別是讓司機頭疼。

任何想法?請注意,m_TexLeft等是0,0,1,0.125(左,上,右,下)和m_Start,m_End是0,100。GetBaseList返回一個通過調用glGenLists(3)得到的整數確切的值是257)。

老實說,看不出有什麼問題。

回答

5

您需要將轉換矩陣操作移出glBegin/glEnd對。這就是documentation所說的:

GLBegin和glEnd之間只能使用GL命令的一個子集。 這些命令是glVertex,glColor,glIndex,glNormal,glTexCoord, glEvalCoord,glEvalPoint,glArrayElement,glMaterial和glEdgeFlag。 另外,可以使用glCallList或glCallLists來執行 只包含上述命令的顯示列表。如果在glBegin和glEnd之間執行任何其他的 GL命令,則錯誤標誌爲 set,並且該命令被忽略。

而下錯誤部分:如果一個命令比glVertex, glColor,glIndex,glNormal,glTexCoord,glEvalCoord,glEvalPoint, glArrayElement,glMaterial,glEdgeFlag,glCallList其他

GL_INVALID_OPERATION產生,或glCallLists是執行glBegin和相應的執行glEnd之間執行的 。

+0

啊是的。我甚至不確定他們在那裏做什麼。我最初在8年前寫過這篇文章 - 但是多年來對驅動程序的改進意味着如果我執行此列表,無論是否執行此列表,此代碼現在都會落在而不是繼續執行。現在編譯好了,謝謝。 – Robinson