2016-09-29 13 views
1

私は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を削除することができますか?

答えて

2

この動作は、OpenGL仕様と一致します。私はOpenGL 3.3仕様を参考にしています。ページ344の付録E.2.2「削除された機能」では

、それは言う:

デフォルトの頂点配列オブジェクト(名ゼロ)も廃止されました。バッファオブジェクトまたは頂点配列オブジェクトがバインドされていないときにVertexAttribPointerを呼び出すと、頂点配列オブジェクトがバインドされていないときに配列描画コマンドを呼び出すので、INVALID_OPERATIONエラーが生成されます。

82ページglValidateProgram()の仕様は言う:

ValidateProgramは、描画コマンドが発行されたときINVALID_OPERATIONエラーにつながる可能性があり、すべての条件をチェックし、同様に他の条件をチェックすることがあります。

ので、描画コマンドがGL_INVALID_OPERATIONエラーを与える場合GL_INVALID_OPERATIONエラー与えVAO拘束意志なしで描画コマンドを発行し、glValidateProgram()チェックするので、何を見ていると、予想とまったく同じです。

+0

ありがとうございました。 Shaderの作成プロセス中にオブジェクトが描画されていないため、シェイダープログラムの検証プロセスのためだけにvaoを作成すると、これを防ぐ有効な方法であると私は頼む必要があります。エラー、または私は、vaosとシェイダー間の接続について何かを誤解して、一時的なvaoを作成することはヒントです、私のレンダリングコードの構造に欠陥がありますか? – iHaveNoIdeaWhatImDoing

+1

@iHaveNoIdeaWhatImDoing:私は、デバッグ補助以外の目的で 'glValidateProgram'を使う必要はないと理解しています。 'GL_LINK_STATUS'をチェックするだけで、コンパイル時の失敗を確認できます。 – ybungalobill

+0

@iHaveNoIdeaWhatImDoing: 'glValidateProgram'の目的は、指定されたプログラムを使用するために必要なすべてがあることを確認することです。この名前は、プログラムを実際に検証するのではなく、実行環境(すなわち、OpenGLコンテキストの状態)がプログラムの要件と一致するので、少し不運です。 – datenwolf

関連する問題