Unerklärlicher OpenGL Fehler im gDEBugger
-
Moin.
Ich kanns mir nicht erklären. Ich habe jetzt etliche Fehlerabfragen bezüglich in meinen Code eingebaut, aber Visual Studio steigt beim Debuggen nicht aus. Also meldet OpenGL keinen Fehler während der Debug Session.
Im gDEBugger schaut das anders aus. Dort genieriert glGetShaderiv ein GL_INVALID_ENUM. Allerdings verwende ich das Ding nur 1x und laut Spezifikation korrekt.NLShader* NLShaderLoader::createFromMemory( const char* name, const char* vertex, const char* fragment ) { std::string srcVertex(vertex); std::string srcFragment(fragment); if ( srcVertex.length() != 0 && srcFragment.length() != 0 ) { // Create OpenGL-Handles GLuint hVertex = glCreateShader(GL_VERTEX_SHADER_ARB); GLuint hFragment = glCreateShader(GL_FRAGMENT_SHADER_ARB); // Load the source into OpenGL const GLchar* pSrcVertex = static_cast<const GLchar*>(srcVertex.c_str()); const GLchar* pSrcFragment = static_cast<const GLchar*>(srcFragment.c_str()); glShaderSource(hVertex, 1, &pSrcVertex, NULL); glShaderSource(hFragment, 1, &pSrcFragment, NULL); // Compile the Shaders glCompileShader(hVertex); glCompileShader(hFragment); if ( this->checkShader(name, hVertex) == false || this->checkShader(name, hFragment) == false ) { #ifdef _DEBUG if ( glGetError() != GL_NO_ERROR ) throw NLException("GL_ERROR"); #endif glDeleteShader(hVertex); glDeleteShader(hFragment); return NULL; } // Create Program GLuint hProgram = glCreateProgram(); // Attach glAttachShader(hProgram, hVertex); glAttachShader(hProgram, hFragment); // Link glLinkProgram(hProgram); if ( this->checkProgram(name, hProgram) == false) { #ifdef _DEBUG if ( glGetError() != GL_NO_ERROR ) throw NLException("GL_ERROR"); #endif glDeleteShader(hVertex); glDeleteShader(hFragment); return NULL; } // Detach glDetachShader(hProgram, hVertex); glDetachShader(hProgram, hFragment); glDeleteShader(hVertex); glDeleteShader(hFragment); #ifdef _DEBUG if ( glGetError() != GL_NO_ERROR ) throw NLException("GL_ERROR"); #endif NLShader* handle = new NLShader(hProgram, name); return handle; } return NULL; } NLShader* NLShaderLoader::create(const char* name, const char* vertex, const char* fragment) { // Load the file std::string srcVertex = this->loadFile(vertex); std::string srcFragment = this->loadFile(fragment); return this->createFromMemory(name, srcVertex.c_str(), srcFragment.c_str()); } bool NLShaderLoader::checkShader(const char* name, unsigned int shader) { bool r = true; GLint infoLogLength = 1024; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength); char* buffer = new char[infoLogLength+1]; memset(buffer, 0, sizeof(char)*infoLogLength+1); int length = 0; glGetShaderInfoLog(shader, 1024, &infoLogLength, buffer); if ( length > 0 ) { std::stringstream ss; ss << "[Shader:" << name <<":Compiler]: " << buffer; int find = ss.str().find("successfully"); if ( find != std::string::npos ) { NLTrace(ss.str().substr(0, ss.str().size()-2)); m_event(ss.str().substr(0, ss.str().size()-2)); } else { NLError(ss.str().substr(0, ss.str().size()-2)); m_event(ss.str().substr(0, ss.str().size()-2)); r = false; } } delete [] buffer; return r; } bool NLShaderLoader::checkProgram(const char* name, unsigned int program) { bool r = true; char* buffer = new char[1024]; memset(buffer, 0, sizeof(char)*1024); int length = 0; glGetProgramInfoLog(program, 1024, &length, buffer); if ( length > 0 ) { std::stringstream ss; ss << "[Shader:" << name <<":Linker]: " << buffer; glValidateProgram(program); GLint result; glGetProgramiv(program, GL_VALIDATE_STATUS, &result); if ( result == GL_FALSE ) { NLError(ss.str().substr(0, ss.str().size()-2)); m_event(ss.str().substr(0, ss.str().size()-2)); r = false; } else { NLTrace(ss.str().substr(0, ss.str().size()-2)); m_event(ss.str().substr(0, ss.str().size()-2)); } } delete [] buffer; return r; }
Sorry für den langen Code, aber hier soll es angeblich auftreten.
OpenGL Debug Output: API Error, glGetShaderiv parameter <shader> has an invalid value '1': must be a valid shader object name (GL_INVALID_VALUE)
http://h-4.abload.de/img/glerrorjq3e.png
Wenn man hier auf den Callstack schaut, dann sieht man, dass er bei glDeleteShader aussteigt, die Meldung sich aber auf eine andere Funktion bezieht. Die Programmstelle ist mir klar, aber laut VS-Debugger läuft hier alles glatt. Es wird auch soweit alles korrekt angezeigt in meinen Testszenen.
Ich weiss nicht mehr weiter. Ich habs debugged bis zum umfallen, eventuell hat hier noch jemand eine Idee.