2011-12-22 19 views
7

मुझे यह स्वीकार करना होगा कि यह पहली बार शेडर्स को लागू करने वाला है, पहले मैंने केवल फिक्स्ड फ़ंक्शन पाइपलाइन के साथ काम किया है; हालांकि, हालांकि मुझे यकीन है कि मैंने जो भी किया वह सही है - एक त्रुटि होनी चाहिए।ओपनजीएल ग्लिंकप्रोग्राम झूठा रिटर्न देता है लेकिन जानकारी लॉग खाली है; सबकुछ चेक किया गया

glLinkProgram(program) - के लिए पूछे जाने पर GL_FALSE लौटाता है। इसके अतिरिक्त, जानकारी लॉग खाली है (जब मैं लॉग लंबाई पूछता हूं - यह 1 है, जो दस्तावेज़ों के लिए शून्य टर्मिनेटर है, यह जांचता है)। तो लिंकर त्रुटियां, और कोई लॉग नहीं। इसके अलावा, मुझे अभी पता चला है कि जैसे ही मैं gl_Position वर्टेक्स शेडर में चर के दौरान लिंकर की समस्याएं उत्पन्न करता हूं, दोनों ही असाइनमेंट के दौरान और यदि मैं इसे गणना के लिए उपयोग करता हूं। मैंने शेडर विविधताओं के सभी प्रकारों की कोशिश की, यह त्रुटियां हैं लेकिन यह लॉग उत्पन्न करने में विफल रहता है - ऐसा लगता है कि GL_FALSE किसी भी समय gl_Position को छुआ है। दिलचस्प बात यह है कि, टुकड़े के टुकड़े किसी भी समस्या का कारण नहीं बनते हैं।

दोनों खंड और वर्टेक्स शेडर्स कोई त्रुटि के साथ ठीक संकलित करते हैं। जब मैं सिंटैक्स त्रुटियों को पेश करता हूं, तो वे प्रोग्राम निर्माण से पहले पता लगाए जाते हैं, मुद्रित होते हैं, और प्रक्रिया को निरस्त कर दिया जाता है (इसलिए यह ठीक काम करता प्रतीत होता है)। मैंने डीबग किया और सुनिश्चित किया कि फ़ाइलों को ठीक से लोड किया गया है, स्रोत शून्य समाप्त हो गया है, आकार सही हैं, मैंने अनुलग्नक के बाद संलग्न कार्यक्रमों की संख्या की जांच की है और यह 2 (सही लॉल) है। इसे स्पष्टता के लिए हटा दिया गया है, मेरे पास checkForErrors() विधि है जो opengl त्रुटियों की जांच और प्रिंट करता है - कोई भी पता नहीं चला है।

मैं स्टंप हूं, कृपया कोई मदद करें! अब मैं 2 दिनों के लिए इस पर नींद खोने किया गया है ...

यह शेडर लोड करने के लिए कोड है:

FILE *file = fopen(fileName.c_str(), "rb"); 

if(file == NULL) 
{ 
    Log::error("file does not exist: \"" + fileName + "\""); 
    return NULL; 
} 

// Calculate file size 
fseek(file , 0 , SEEK_END); 
int size = ftell(file); 
rewind(file); 

// If file size is 0 
if(size == 0) 
{ 
    Log::error("file is empty: \"" + fileName + "\""); 
    return NULL; 
} 

char **source = new char*[1]; 
source[0] = new char[size+1]; 
source[0][size] = '\0'; 

// If we weren't able to read the entire file into memory 
int readSize = fread(source[0], sizeof(char), size, file); 
if(size != readSize) 
{ 
    int fileError = ferror(file); 

    // Free the source, log an error and return false 
    delete source[0]; 
    delete [] source; 
    fclose(file); 
    Log::error("couldn't load file into memory [ferror(" + toString<int>(fileError) + ")]: \"" + fileName + "\" (Size: " + toString<int>(readSize) + "/" + toString<int>(size) + " bytes)"); 
    return NULL; 
} 

// Close the file 
fclose(file); 




// Create the shader object 


// shaderType is GLenum that is set based on the file extension. I assure you it is correctly set to either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER 
GLuint shaderID = glCreateShader(shaderType); 

// If we could not create the shader object, check for OpenGL errors and return false 
if(shaderID == 0) 
{ 
    checkForErrors(); 
    Log::error("error creating shader \"" + name); 
    delete source[0]; 
    delete [] source; 
    return NULL; 
} 

// Load shader source and compile it 
glShaderSource(shaderID, 1, (const GLchar**)source, NULL); 
glCompileShader(shaderID); 

GLint success; 
glGetShaderiv(shaderID, GL_COMPILE_STATUS, &success); 
if(!success) 
{ 
    GLchar error[1024]; 
    glGetShaderInfoLog(shaderID, 1024, NULL, error); 
    Log::error("error compiling shader \"" + name + "\"\n Log:\n" + error); 
    delete source[0]; 
    delete [] source; 
    return NULL; 
} 
else 
{ 
    Log::debug("success! Loaded shader \"" + name + "\""); 
} 

// Clean up 
delete source[0]; 
delete [] source; 

त्वरित टिप्पणी: glShaderSource - मैं करने के लिए डाली (स्थिरांक GLchar **) क्योंकि जीसीसी गैर-कॉन्स चार पॉइंटर्स के लिए कॉन्स्ट के बारे में शिकायत करता है; अन्यथा, मेरा मानना ​​है कि मैं पूरी तरह से अनुपालन कर रहा हूं।

वैसे भी कोई त्रुटि नहीं है। बिना किसी त्रुटि के शेडर्स (नीचे) संकलित करें।

शीर्ष shader:

void main() 
{ 
    // If I comment the line below, the link status is GL_TRUE. 
    gl_Position = vec4(1.0, 1.0, 1.0, 1.0); 
} 

टुकड़ा shader:

void main() 
{ 
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
} 

नीचे, कोड है कि शेडर कार्यक्रम बनाता है वस्तुओं और लिंक आदि .:

// Create a new shader program 
GLuint program = glCreateProgram(); 
if(program == 0) 
{ 
    Log::error("RenderSystem::loadShaderProgram() - could not create OpenGL shader program; This one is fatal, sorry."); 
    getContext()->fatalErrorIn("RenderSystem::loadShaderProgram(shader1, shader2)", "OpenGL failed to create object using glCreateProgram()"); 
    return NULL; 
} 

// Attach shader objects to program 
glAttachShader(program, vertexShaderID); 
glAttachShader(program, fragmentShaderID); 

// Link the program 
GLint success = GL_FALSE; 
glLinkProgram(program); 
checkForErrors(); 
glGetProgramiv(program, GL_LINK_STATUS, &success); 
if(success == GL_FALSE) 
{ 
    GLchar errorLog[1024] = {0}; 
    glGetProgramInfoLog(program, 1024, NULL, errorLog); 
    Log::error(std::string() + "error linking program: " + errorLog); 
    return NULL; 
} 

success = GL_FALSE; 
glValidateProgram(program); 
glGetProgramiv(program, GL_VALIDATE_STATUS, &success); 
if(success == GL_FALSE) 
{ 
    GLchar errorLog[1024] = {0}; 
    glGetProgramInfoLog(program, 1024, NULL, errorLog); 
    checkForErrors(); 
    Log::error(std::string() + "error validating shader program; Details: " + errorLog); 
    return NULL; 
} 

आमतौर पर यह देता कार्यक्रम को मान्य करने तक भी उतना ही नहीं मिलता है ... मैं इससे बहुत निराश हूं, बी नहीं करना बहुत मुश्किल है ई वल्गार।

आपकी मदद की ज़रूरत है और किसी भी सहायता की सराहना की जाती है!

संपादित करें: मैं इंटेल एचडी 3000 (ओपनजीएल के लिए 3.1 तक समर्थन के साथ) पर सब कुछ चला रहा हूं। मेरा लक्ष्य ओपनजीएल संस्करण 2.0 है।

EDIT2: मैं यह भी ध्यान रखना चाहूंगा कि अगर मैं "आर" या "आरटी" झंडे को फॉपेन में सेट करता हूं तो पाठकों से पाठकों को पढ़ने में कुछ समस्याएं थीं - पढ़ने का आकार वास्तविक आकार से लगभग 10 तक छोटा था बाइट्स (लगातार सभी फाइलों पर) - और feof() सच हो जाएगा। जब मैंने बाइनरी ("आरबी") में पढ़ने के लिए स्विच किया तो समस्या दूर हो गई और फाइलें पूरी तरह से पढ़ी गईं। मैंने कई वैकल्पिक कार्यान्वयनों का प्रयास किया और वे सभी लिंकिंग के दौरान एक ही त्रुटि उत्पन्न करते हैं (और मैं फ़ाइल को पढ़ने के बाद सही ढंग से कंसोल करने के लिए शेडर स्रोत मुद्रित करता हूं ताकि यह सही लगे, यह करता है।)।

+1

आपके शेडर में आपका '# संस्करण' घोषणा कहां है? –

+0

मैंने एक शामिल नहीं किया ... क्या यह हो सकता है? मैं इसे गूगल कर दूंगा, लेकिन अगर मैं कर सकता हूं - ओपनजीएल 2.0 लक्ष्य के लिए उपयुक्त शेडर संस्करण क्या होगा? – Kaa

+0

मैंने तीन अलग-अलग परीक्षणों (दोनों शेडरों के लिए एक ही संस्करण) में #version 150, #version 140, और #version 130 का उपयोग करने का प्रयास किया, और परिणाम समान हैं - लिंक स्थिति GL_FALSE लौटाती है, और कोई जानकारी लॉग नहीं :( – Kaa

उत्तर

14

ठीक है, मुझे पता था कि जब मैं पोस्ट कर रहा था कि यह शर्मनाक होगा, लेकिन यह काफी खराब है: इंटेल ग्राफिक्स कॉन्फ़िगरेशन एप्लिकेशन जो आमतौर पर इंटेल ड्राइवर के साथ होता है, में 3 डी सेटिंग्स टैब होता है; अब, "कस्टम सेटिंग्स" चेक बॉक्स को अनचेक किया गया था, लेकिन "वर्टेक्स प्रोसेसिंग" सेटिंग के तहत ग्रेड आउट विकल्प "सॉफ़्टवेयर प्रोसेसिंग सक्षम करें" की वर्तनी की गई है। भले ही यह अनचेक किया गया था और सब कुछ भूरे रंग से बाहर हो गया था, मैंने बस कस्टम सेटिंग्स में प्रवेश किया और सब कुछ "एप्लिकेशन सेटिंग्स" में चेक किया।

यह तय किया गया है! सब कुछ इस तरह के लिंक चाहिए! पता नहीं कि उस विकल्प के बारे में किसने सोचा, वह कभी भी उपयोगी क्यों होगा ?! यह एकमात्र विकल्प है जो आश्चर्यजनक रूप से जगह से बाहर दिखता है।

मैं कई ड्राइवर पुनः स्थापित, तीव्र डीबगिंग और कॉन्फ़िगरेशन शोध के माध्यम से चला गया, मुझे अनुमान लगाया गया और बिल्कुल सबकुछ पर दूसरा अनुमान लगाया गया! भयानक, यह मेरे सबसे बुरे दुश्मनों पर नहीं चाहेगा। सभी को परेशान करने के लिए खेद है, लेकिन अगर वहां कोई और गूंगा *** है, तो मेरा स्वागत है :)