2

OpenGL の学習については、openglbookを参照しています。現在、第 2 章で、参照用にここに貼り付けられているコードを実行しようとしています。

私が直面している問題は、以下の機能にあります。

void CreateShaders(void)
{
    GLenum ErrorCheckValue = glGetError();

    VertexShaderId = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(VertexShaderId, 1, &VertexShader, NULL);
    glCompileShader(VertexShaderId);

    FragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(FragmentShaderId, 1, &FragmentShader, NULL);
    glCompileShader(FragmentShaderId);

    ProgramId = glCreateProgram();
        glAttachShader(ProgramId, VertexShaderId);
        glAttachShader(ProgramId, FragmentShaderId);
    glLinkProgram(ProgramId);
    glUseProgram(ProgramId);

    ErrorCheckValue = glGetError(); // =====> returns GL_INVALID_OPERATION
    if (ErrorCheckValue != GL_NO_ERROR)
    {
        fprintf(
            stderr,
            "ERROR: Could not create the shaders: %s \n",
            gluErrorString(ErrorCheckValue)
        );

        exit(-1);
    }
}

上記の function( glew.h) に示されているように、なぜ が返されるの"GL_INVALID_OPERATION"でしょうか?
これらの行にコメントを付けると、機能しますが、空白のウィンドウが表示されます。

これが私のglxinfoです。私のバージョンは 2.2 で、このコードは 3.3 以降を対象としているため、失敗を避けるために以下のコードを削除しました。

  glutInitContextVersion(4, 0); 
  glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
  glutInitContextProfile(GLUT_CORE_PROFILE);

更新: @Tim の回答からの提案に従った後、プログラムを正常に実行できました。これらの行は作成上の問題だったようです:

"#version 400\n" ("#version 130" に置き換え)

レイアウト (場所 = 0) (削除されました)。layout(location=1) (削除済み)。

ただし、これにより、予想される三角形がまったく同じに印刷されません。おそらく、チュートリアルは最新のopenglバージョンを念頭に置いて教えていますが、それは私が持っていないため、問題が発生します。

出力を変更せずに、コードを最新の OpenGL (4.0+) 互換コードから下位バージョン (たとえば < 3.0) に変更する方法はありますか? グラフィックハードウェアをアップグレードできません。

4

1 に答える 1

6

シェーダーのコンパイルとリンクに対して適切なエラー チェックを行っていません。シェーダーに何らかの構文エラーがあり、コンパイルが妨げられている可能性があります。そのため、useProgram 呼び出しで無効なプログラムを使用しようとしています。

各シェーダーについて、呼び出した後、コンパイルが成功したかどうかを伝えるために、またはcompile_status を返すglCompileShader呼び出しが必要になります。そうでない場合は、 を呼び出して infoLog のサイズを取得し、 を呼び出して、コンパイル中に発生したエラーを示す文字列を取得できます。 glGetShaderiv(shader, GL_COMPILE_STATUS, compile_status)truefalseglGetShaderiv(shader, GL_INFO_LOG_LENGTH, length)glGetShaderInfoLog()

要約すると、コンパイラ/リンカーのエラー チェックは次のようになります。

void CheckError (GLuint shaderId, uint LINE)
{
  GLint bCompiled;
  glGetShaderiv(shaderId, GL_COMPILE_STATUS, &bCompiled);
  if(bCompiled == false)
  {
    GLint length;
    glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &length);
    GLchar *pInfo = new GLchar[length + 1];
    glGetShaderInfoLog(shaderId, length, &length, pInfo);
    fprintf(stderr, "called at line-%u: Compiler/Linker error: %s", LINE, pInfo);
    delete[] pInfo;
  }
}

両方のシェーダーが正常にコンパイルされた場合、プログラムをリンクした後、プログラム オブジェクトで同じことをglGetProgramiv/GL_LINK_STATUSおよびでテストします。glGetProgramInfoLog

于 2012-09-07T03:08:17.733 に答える