2017-02-26 15 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()); 
} 

をシェーダが

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; 
} 

#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; 
} 

のように見える私は、エラーを生成しようシェーダからのメッセージby

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,...)を呼び出しています。 プログラム(そのうちの1つしかありません)に関する情報を取得しようとすると、シェーダオブジェクトごとに1回、checkShader関数を2回呼び出すことはわずかな意味がありません。また、そのように関数の名前を付けるのも意味がありません。GL_LINK_STATUSの場合です。

+0

私はものが混ざっているように見えます。それをクリアしていただきありがとうございます! – pingul

関連する問題