2017-02-26 55 views
1

我一直在試圖找出很長一段時間,但無法設法讓事情工作。我只想編譯/運行我的OpenGL程序,但是我的着色器沒有正確鏈接,並且沒有收到有用的錯誤消息。在一種情況下,錯誤純粹是空的,而在另一種情況下,出於某種原因它是??y?OpenGL着色器鏈接錯誤,沒有錯誤信息

創建了一個程序,編譯我着色器,我有以下代碼:

GLuint buildProgram(const char* vertexShaderFile, const char* fragmentShaderFile) 
{ 
    std::string vs = fileContents(vertexShaderFile); 
    std::string fs = fileContents(fragmentShaderFile); 
    return createProgram(vs.c_str(), fs.c_str()); 
} 

着色器看起來像

#version 330 
out vec4 out_color; 
void main() 
{ 
    out_color = vec4(0.5, 0.5, 0.5, 0.5); 
} 

#version 330 
in vec4 in_Position; 
void main() 
{ 
    gl_Position = in_Position; 
} 

隨着

GLuint createProgram(const char* vertexSource, const char* fragmentSource) 
{ 
    GLuint vertexshader = createShader(vertexSource, GL_VERTEX_SHADER); 
    GLuint fragmentshader = createShader(fragmentSource, GL_FRAGMENT_SHADER); 
    GLuint program = glCreateProgram(); 

    glAttachShader(program, vertexshader); 
    glAttachShader(program, fragmentshader); 

    glLinkProgram(program); 
    GLint ret; 
    checkShader(vertexshader, GL_LINK_STATUS, &ret, "unable to link vertex shader"); 
    checkShader(fragmentshader, GL_LINK_STATUS, &ret, "unable to link fragment shader"); 

    glUseProgram(program); 
    return program; 
} 

GLuint createShader(const char* source, GLenum shaderType) 
{ 
    GLuint shader = glCreateShader(shaderType); 
    glShaderSource(shader, 1, &source, NULL); 
    glCompileShader(shader); 
    GLint isCompiled = 0; 
    checkShader(shader, GL_COMPILE_STATUS, &isCompiled, "shader failed to compile"); 
    if (isCompiled == GL_FALSE) 
    { 
     glDeleteShader(shader); 
     return 0; 
    } 
    return shader; 
} 

我嘗試生成錯誤來自着色器的消息通過

void checkShader(GLuint shader, GLuint type, GLint* ret, const char* onfail) 
{ 
    switch(type) { 
     case(GL_COMPILE_STATUS): 
     glGetShaderiv(shader, type, ret); 
     if(*ret == false) { 
      int infologLength = 0; 
      glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infologLength); 
      GLchar buffer[infologLength]; 
      GLsizei charsWritten = 0; 
      std::cout << onfail << std::endl; 
      glGetShaderInfoLog(shader, infologLength, &charsWritten, buffer); 
      std::cout << buffer << std::endl; 
     } 
     break; 
    case(GL_LINK_STATUS): 
     glGetProgramiv(shader, type, ret); 
     if(*ret == false) { 
      int infologLength = 0; 
      glGetProgramiv(shader, GL_INFO_LOG_LENGTH, &infologLength); 
      GLchar buffer[infologLength]; 
      GLsizei charsWritten = 0; 
      std::cout << onfail << std::endl; 
      glGetProgramInfoLog(shader, infologLength, &charsWritten, buffer); 
      std::cout << buffer << std::endl; 
     } 
     break; 
    default: 
     break; 
    }; 
} 

運行GLuint program = buildProgram("shaders/test.vert", "shaders/test.frag");給我下面的輸出:

無法鏈接頂點着色器

無法鏈接片段着色器

,θY?

錯誤編譯程序 錯誤502:GL_INVALID_OPERATION

是否有人在猜測,爲什麼我的着色器編譯得很好,但沒有聯繫呢?

+0

着色器對象沒有鏈接狀態。改爲查詢着色器程序對象。 – BDL

回答

5

您正在致電getProgramiv(...,GL_LINK_STATUS,...)着色器對象。即使你試圖獲得有關程序(其中只有一個)的信息,它甚至沒有絲毫意義,即使兩次調用該函數 - 每個着色器對象一次。對於GL_LINK_STATUS的情況,這樣命名功能也沒有意義。

+0

似乎我有東西混合起來。謝謝你清除! – pingul