2014-11-22 60 views
0

我正在處理我的圖形程序。我正在嘗試從Shaders中將特徵抽象爲一個類。我測試了常規繪圖代碼,它工作。着色器也可以運行,但只要我開始使用這些OpenGL着色器功能,就會停止工作。着色器附件錯誤。無論是無效的程序或着色器

Shader::Shader(char c) 
{ 
    //program = int(0); 
    if (program!=0 || glIsProgram(program)) 
     glDeleteProgram(program); 
    uniforms.clear(); 

    program = glCreateProgram(); 
} 

void Shader::compileProgram() 
{ 
    GLint Result = GL_FALSE; 
    int InfoLogLength; 

    glLinkProgram(program); 

    glValidateProgram(program); 

    glGetProgramiv(program, GL_LINK_STATUS, &Result); 
    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &InfoLogLength); 
    std::string ProgramErrorMessage = std::string(); 
    ProgramErrorMessage.resize(glm::max(InfoLogLength, int(1))); 
    glGetProgramInfoLog(program, InfoLogLength, NULL, &ProgramErrorMessage[0]); 
    std::cout << ProgramErrorMessage.c_str() << std::endl; 
} 

void Shader::addToProgram(std::string File, GLenum type) 
{ 
    std::cout << glGetError() << std::endl; 

    GLuint shader = glCreateShader(type); 

    std::cout << glewGetErrorString(glGetError()) << std::endl; 

    std::string ShaderCode; 
    std::ifstream ShaderStream(File, std::ios::in); 
    if(ShaderStream.is_open()) 
    { 
     std::string Line = ""; 
     while(getline(ShaderStream, Line)) 
      ShaderCode += Line + "\n"; 
     ShaderStream.close(); 
    } 

    GLint Result = GL_FALSE; 
    int InfoLogLength; 

    // Compile Vertex Shader 
    std::cout << "Compiling shader : " << File<< std::endl; 
    const char * SourcePointer = ShaderCode.c_str(); 
    std::cout << SourcePointer << std::endl; 
    int length = ShaderCode.size(); 
    glShaderSource(shader, 1, &SourcePointer , &length); 

    glCompileShader(shader); 

    // Check Vertex Shader 
    glGetShaderiv(shader, GL_COMPILE_STATUS, &Result); 
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &InfoLogLength); 
    std::vector<char> ShaderErrorMessage(InfoLogLength); 
    glGetShaderInfoLog(shader, InfoLogLength, NULL, &ShaderErrorMessage[0]); 
    printf("%s\n", &ShaderErrorMessage[0]); 

    glAttachShader(program, shader); //Invalid Operation, eighter Program or shader invalid 

    std::cout << glGetError() << std::endl; 

}

+0

您是否收到編譯器錯誤?您查詢着色器是否編譯正確,但不在某處使用「結果」。 – BDL 2014-11-22 13:41:58

+0

問題是我沒有得到任何信息輸出。但結果是0(GL_FALSE)。 我真的解決了它的程序是由於某種原因無效 – Deathlymad 2014-11-23 06:55:22

回答

0

所以問題是,該方案是無效的。

我所做的是:

if(!glIsProgram(program)) 
    program = glCreateProgram(); 

glAttachShaders(program, shader); 

我做了同樣的後衛在構造函數中。我仍然想知道這是怎麼發生的。我的意思是我檢查了調試中的值,他們都似乎有效。