2012-11-18 13 views
9

मैं कुछ समय के लिए एक जीएल कार्यक्रम पर काम कर रहा हूं और अचानक यह त्रुटियों को देना शुरू कर दिया।बिना किसी कारण के glEnd पर अमान्य ऑपरेशन?

#include <GL/glut.h> 
#include <iostream> 

#define CHECK_GL_ERR() printError(__LINE__) 

void printError(int line) 
{ 
     GLenum err = glGetError(); 
     if(err != GL_NO_ERROR) 
     { 
       std::cerr << "GL error on line " << line << ": " << gluErrorString(err) << std::endl; 
     } 
} 

void displayFunc() 
{ 
     CHECK_GL_ERR(); 
     glBegin(GL_POINTS); 
     CHECK_GL_ERR(); 
     glVertex3f(0, 0, 0); 
     CHECK_GL_ERR(); 
     glEnd(); 
     CHECK_GL_ERR(); //line 23 
     exit(0); 
} 

int main(int argc, char **argv) 
{ 
     glutInit(&argc, argv); 
     glutInitWindowSize(300, 300); 
     glutCreateWindow("Test"); 

     glutDisplayFunc(displayFunc); 

     glutMainLoop(); 
} 

जब मैं इस कार्यक्रम को चलाने के लिए यह उत्पादन देता है:

GL error on line 23: invalid operation 

तो यह है कि glEnd(); लगता थोड़ी देर के लिए इन को हल करने की कोशिश के बाद मैं एक छोटी परीक्षण कार्यक्रम है कि एक ही व्यवहार उत्पन्न करता है लिखा था त्रुटि का कारण बनता है। डॉक्स कहते हैं:

GL_INVALID_OPERATION उत्पन्न होता है अगर glEnd एक glBegin से पहले किया जा रहा बिना निष्पादित किया जाता है।

जो मेरे कोड में नहीं है। तो क्या कोई देखता है, यह कोड एक त्रुटि संदेश क्यों देता है?

पीएस: बेशक मुझे पता है कि ग्लोबजिन/एंड को लंबे समय से हटा दिया गया है/हटा दिया गया है, लेकिन कोड की कुछ छोटी मात्रा को एक साथ जोड़ना बहुत सुविधाजनक है। इसके अलावा कार्यक्रम ने त्रुटियों के बिना काम किया जब तक कि जीएल ने अजीब होने का फैसला नहीं किया।

संपादित

मैं बस जो दिया glslDevil के साथ एक ट्रेस किया:

W! Program Start 
| glXQueryExtension(0x1ab03f0, (nil), (nil)) 
| glXChooseFBConfig(0x1ab03f0, 0, 0x7fffb8fcf8b0, 0x7fffb8fcf8a4) 
| glXGetVisualFromFBConfig(0x1ab03f0, 0x111) 
| glXGetProcAddressARB(0x7f93c37526e5) 
| glXCreateNewContext(0x1ab03f0, 0x111, 32788, (nil), 1) 
| glXIsDirect(0x1ab03f0, 0x1ac8de8) 
| glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8) 
| glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8) 
| glDrawBuffer(GL_FRONT) 
| glReadBuffer(GL_FRONT) 
| glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8) 
| glViewport(0, 0, 300, 300) 
| glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8) 
| glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8) 
| glGetError() 
| glBegin(GL_POINTS) 
| glGetError() 
| glVertex3f(0,000000, 0,000000, 0,000000) 
| glGetError() 
| glEnd() 
W! OpenGL error GL_INVALID_OPERATION detected 
| glGetError() 
| glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8) 
| glXDestroyContext(0x1ab03f0, 0x1ac8de8) 
E! Child process exited 
W! Program termination forced! 
+0

सफाई और फिर परियोजना का पुनर्निर्माण संभवतः इस तरह की "आश्चर्य" समस्या को हल कर सकता है .. –

+0

जैसा कि आप देख सकते हैं कि यह छोटा उदाहरण पूरी तरह से त्रुटि का खुलासा करता है और मैंने इसे डेमो रखने के लिए स्क्रैच से बनाया है। लेकिन सिर्फ पूर्णता के लिए: मैंने द्विआधारी हटा दी और पुनः संकलित किया और त्रुटि यह कहां रहती है। – Nobody

+0

उबंटू 12.04, जीसीसी 4.6.3 पर त्रुटि की पुष्टि हुई। –

उत्तर

13

कुछ परीक्षण बाद, मैंने पाया अपने कार्यक्रम के लिए दो सरल मुद्दे हैं:

  1. आप नहीं करना चाहिए glGegin/glEnd ब्लॉक के अंदर glGetError का उपयोग करें। API इसके बारे में सख्त है। लेकिन glEnd के बाद त्रुटि केवल होती है। यदि आप एपीआई पढ़ते हैं, तो आप पाएंगे कि त्रुटि फैल सकती है: यह केवल glEnd के बाद होता है।
  2. एक सेगमेंटेशन गलती तब होती है जब आप एक्ज़िट (0) का उपयोग डिस्प्ले फ़ंक्शन (जो केवल इंटेल ड्राइवर के साथ होता है) के अंदर होता है। ऐसा इसलिए होता है क्योंकि जीएल संदर्भ अभी तक मुक्त नहीं हुआ है, और एक ड्राइवर बग साथ आता है। इसलिए आपको प्रदर्शन फ़ंक्शन के अंदर बाहर निकलने से बचना चाहिए।
+0

वाह मैंने मैक्रो के साथ खुद को बेवकूफ़ बना दिया और भूल गया कि glGetError एक जीएल कॉल है। उस पर शोध के लिए धन्यवाद। बिंदु 2 के बारे में मैं इंटेल ड्राइवर का उपयोग नहीं करता हूं और निकास केवल कई निष्पादन को रोकने के लिए जोड़ा गया था, क्योंकि सभी कार्यक्रम इस बिंदु पर और कुछ नहीं करते हैं। – Nobody

संबंधित मुद्दे