2012-07-03 48 views
4

問題:OpenGL着色(S)拒絕鏈接

一直在努力讓我的代碼加載外部着色器和它不工作。無論我如何重寫代碼,並再次嘗試,我每次都會得到相同的錯誤。

着色器編譯但不會鏈接,有什麼我在這個函數中做錯了嗎?錯誤捕捉塊很好用。

Fragment shader(s) failed to link, vertex shader(s) failed to link. 
ERROR: error(#280) Not all shaders have valid object code. 
ERROR: error(#280) Not all shaders have valid object code. 

我使用freeglut,7和MinGW(和我不使用IDE)64窗戶

用法:

在我的主循環我有GLuint programId = loadShader("vertex.shader", "frag.shader"); 然後我啓用與glUseProgram();

GLuint loadShader(const char * vertex_file_path, const char * fragment_file_path) { 

    GLuint vertexShaderId = glCreateShader(GL_VERTEX_SHADER); 
    GLuint fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER); 
    GLuint programId = glCreateProgram(); 

    GLint status = GL_FALSE; 
    int infoLogLength; 
    std::string line = ""; 

    //read in and compile 
    std::string vertexShaderCode = ""; 
    std::ifstream vifs(vertex_file_path); 
    if(!vifs.is_open()) { 

     while(getline(vifs, line)) 
      vertexShaderCode += line +"\n"; 
     vifs.close(); 
    } 

    const char * vertexStream = vertexShaderCode.c_str(); 

    std::string fragmentShaderCode = ""; 
    std::ifstream fifs(fragment_file_path); 
    if(!fifs.is_open()) { 

     while(getline(fifs, line)) 
      fragmentShaderCode += line +"\n"; 
     fifs.close(); 
    } 

    const GLchar * fragmentStream = fragmentShaderCode.c_str(); 

    glShaderSource(vertexShaderId, 1, &vertexStream, NULL); 
    glCompileShader(vertexShaderId); 

    glShaderSource(fragmentShaderId, 1, &fragmentStream, NULL); 
    glCompileShader(fragmentShaderId);  

    glGetShaderiv(vertexShaderId, GL_COMPILE_STATUS, &status); 
    glGetShaderiv(vertexShaderId, GL_INFO_LOG_LENGTH, &infoLogLength); 
    std::vector<char> vertexShaderErrorMessage(infoLogLength); 
    glGetShaderInfoLog(vertexShaderId, infoLogLength, NULL, &vertexShaderErrorMessage[0]); 
    fprintf(stdout, "%s\n", &vertexShaderErrorMessage[0]); 

    glGetShaderiv(fragmentShaderId, GL_COMPILE_STATUS, &status); 
    glGetShaderiv(fragmentShaderId, GL_INFO_LOG_LENGTH, &infoLogLength); 
    std::vector<char> fragmentShaderErrorMessage(infoLogLength); 
    glGetShaderInfoLog(fragmentShaderId, infoLogLength, NULL, &fragmentShaderErrorMessage[0]); 
    fprintf(stdout, "%s\n", &fragmentShaderErrorMessage[0]); 

    glAttachShader(programId, vertexShaderId); 
    glAttachShader(programId, fragmentShaderId); 
    glLinkProgram(programId); 
    glUseProgram(programId); 

    glGetProgramiv(programId, GL_LINK_STATUS, &status); 
    glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &infoLogLength); 
    std::vector<char> programErrorMessage(std::max(infoLogLength, int(1))); 
    glGetProgramInfoLog(programId, infoLogLength, NULL, &programErrorMessage[0]); 
    fprintf(stdout, "%s\n", &programErrorMessage[0]); 

    glDeleteShader(vertexShaderId); 
    glDeleteShader(fragmentShaderId); 

    return programId; 
    } 

[vertex.shader]

#version 400 

layout(location=0) in vec4 in_Position; 
layout(location=1) in vec4 in_Color; 
out vec4 ex_Color; 

void main(void) { 
    gl_Position = in_Position; 
    ex_Color = in_Color; 
} 

frag.shader

#version 400 

in vec4 ex_Color; 
out vec4 out_Color; 

void main(void) { 
    out_Color = ex_Color; 
} 
+0

使用更簡單的着色器進行測試,就像找到的[here](http://stackoverflow.com/questions/11122815/opengl-shaders-dont-link-with-shader-program),找出問題是否存在是着色器或加載代碼。 –

+0

問題不在於着色器,它們以完美的內聯方式工作。只是不當我嘗試加載它們,並且該帖子沒有解決(他修復了一個錯誤,並得到了另一個,我不想這樣),這就是爲什麼我創建了這個。 – iKlsR

回答

3

你只讀文件,如果他們未能打開。現在您將空字符串傳遞給glShaderSource

更改is_open測試(更好的是,檢查good()而不是is_open()),並且事情可能會起作用。

變化

std::ifstream vifs(vertex_file_path); 
if(!vifs.is_open()) { // <<=== BACKWARDS! 

    while (getline(vifs, line)) 
     vertexShaderCode += line + "\n"; 
    vifs.close(); 
} 

{ 
    std::ifstream vifs(vertex_file_path); 
    while(getline(vifs, line)) 
     vertexShaderCode += line +"\n"; 
} 

既然你想讀取整個文件,看看this question一些更好的方法。

+0

我試過你的方法,但仍然是相同的錯誤,但我正在處理空字符串的想法。謝謝。 – iKlsR

+1

@iKlsR:你是什麼意思,「兩個」我的方法?第一個是你*錯誤的*代碼。在我的測試中,根本沒有'if'測試,while循環負責處理它。 –

+0

你說改變is_open()測試爲好()..我試過,然後我試着出去如果測試。同樣的錯誤。 :( – iKlsR