プログラムをアンバインドしてリバウンドする際に、すべての属性バインディングを復元する方法を知りたい。私がVAOを使用している場合は、VAOをリバウンドさせるのと同じくらい簡単ですが、VAOを使用しないときはわかりません。私はVBOを作成していますが、VAOは作成していません。プログラムがバインドされてからリバウンドされた後に属性バインディングを復元する方法
は、私は、次の
glUseProgram(shader1);
// Now set uniforms.
glUniformMatrix4fv(matrix_handdle, 1, false, matrix);
glBindBuffer(GL_ARRAY_BUFFER, bufferIndex);
glEnableVertexAttribArray(m_attributes[position_1]);
glVertexAttribPointer(m_attributes[POSITION_HANDLE], 3, GL_FLOAT, false, 3 * sizeof(GLfloat), 0);
は今現在のプログラムを保存した場合は、VBOはバインドさ。次に、2番目のプログラムを使用します。
glUseProgram(shader2);
//bind some new vbo, set some uniform, vertex attribute variable.
element.draw();
最初のシェーダプログラムを使用します。 、私は頂点サイズ、ストライド、タイプのためglGetVertexAttrib()関数を使用して属性値を取得する必要があると思うVBO
glUseProgram(shader1); //Here, do the attributes set in first shader program remain?
element.draw();
を再バインドフラグを正規化し、すべての頂点属性の結合および配列ポインタをバッファリングし、それらを保存します。次にプログラムをリバインドすると、頂点の属性値が設定されます。私は、GL_MAX_VERTEX_ATTRIBSを使ってシェイダープログラムのMax属性を取得し、すべての属性の場所の値を保存/復元する必要があると思います。正しいか、どこか間違っていますか?
私の質問は、VAOを使用していない状況に関するものでした。私はちょうどVBOを使用しています。私はGL_MAX_VERTEX_ATTRIBSを取得し、サイズ、ストライド、タイプ、正規化フラグ、バッファバインディング、すべての頂点属性の配列ポインタを保存して保存する必要があると思います。次に、シェーダープログラムを再バインドした後、再びglVertexAttribPointerを使用して頂点属性値を設定します。それは正しいですか、私はどこか間違っていますか? –
しかし、これらの属性を最初に設定したのは誰ですか?私は*あなた*があなたのプログラムのどこかに既にすべての情報を持っていると思うでしょう。あなたはVAOを実装するライブラリを構築しようとしていますか?どうして?すでにOpenGL 3.0と呼ばれているものがあります。 ;) –
これらの値は、ライブラリを使用して設定されます。はい、あなたは正しいです私はVAOがあなたのために何をしているのか試しています。 opengl 2.0を使っている人なら、私はそれをする必要があります。私は私の質問を更新しました。見てください。私は –