2017-02-26 56 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