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.


Anmelden zum Antworten