私はLWJGL/OpenGL 3のシェーダプログラムの検証に問題があります。
ドキュメントを読みましたが、glValidateProgramを呼び出すときにVAOが必要な理由を見つけることができません。VAOがバインドされていないとglValidateProgramが失敗するのはなぜですか?
int program = glCreateProgram();
int vertexShader = glCreateShader(...);
int fragmentShader = glCreateShader(...);
// ... vertex and fragment shader loading, compiling, errorchecking ...
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
glBindAttribLocation(program, 0, "position");
glBindAttribLocation(program, 1, "color");
glLinkProgram(program);
glDetachShader(program, shader);
glDetachShader(program, shader);
glValidateProgram(program);
if (glGetProgrami(program, GL_VALIDATE_STATUS) != GL_TRUE)
System.exit(-1);
これは、エラーメッセージなしでプログラムを終了します。
GL_LINK_STATUSはOKで、GL.getErrors()には何も報告されません。
しかし、glValidateProgramの周りにVAOを作成するとうまくいきます。
glGetProgramiがGL_FALSEを返してシェーダプログラムを実行するという事実だけを無視することもできます。
私はglValidateProgram周りVAOを()を作成して何を意味:私はこれを行うと
int vao = glGenVertexArrays();
glBindVertexArray(vao);
glValidateProgram(program);
if (glGetProgrami(program, GL_VALIDATE_STATUS) != GL_TRUE)
System.exit(-1);
glDeleteVertexArrays(vao);
、GL_VALIDATE_STATUSが真であると私は私のものを描くことができます。
使用されているシェーダは、単純なパススルーシェーダです。
頂点シェーダが位置を返し、フラグメントシェーダが色を返します。
なぜ、検証後すぐにVAOを削除することができますか?
ありがとうございました。 Shaderの作成プロセス中にオブジェクトが描画されていないため、シェイダープログラムの検証プロセスのためだけにvaoを作成すると、これを防ぐ有効な方法であると私は頼む必要があります。エラー、または私は、vaosとシェイダー間の接続について何かを誤解して、一時的なvaoを作成することはヒントです、私のレンダリングコードの構造に欠陥がありますか? – iHaveNoIdeaWhatImDoing
@iHaveNoIdeaWhatImDoing:私は、デバッグ補助以外の目的で 'glValidateProgram'を使う必要はないと理解しています。 'GL_LINK_STATUS'をチェックするだけで、コンパイル時の失敗を確認できます。 – ybungalobill
@iHaveNoIdeaWhatImDoing: 'glValidateProgram'の目的は、指定されたプログラムを使用するために必要なすべてがあることを確認することです。この名前は、プログラムを実際に検証するのではなく、実行環境(すなわち、OpenGLコンテキストの状態)がプログラムの要件と一致するので、少し不運です。 – datenwolf