2016-06-13 16 views
1

プログラムをアンバインドしてリバウンドする際に、すべての属性バインディングを復元する方法を知りたい。私が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属性を取得し、すべての属性の場所の値を保存/復元する必要があると思います。正しいか、どこか間違っていますか?

答えて

2

glVertexAttribPointerを使用して、VBOデータをシェーダ呼び出しにバインドする方法を定義します。ですから、glVertexAttribPointerを1回以上呼び出すことができます。 g。頂点の位置、法線、およびテクスチャデータを定義し、描画します。

VAOのポイントは、glVertexAttribPointerへの複数のコールの問題を軽減することです。描画する前にglVertexAttribPointerを呼び出す代わりに、状態をVAOに格納してから、描画する前にglBindVertexArray​を一度呼び出すだけで済みます。したがって、VAOの全体のポイントは、自分で状態を保存する必要がないということです。VAOがそれを処理させるようにします。それを行う方法については、多くのチュートリアルがあります。

シェーダが同じ入力フォーマットを使用している限り、同じVAOを持つ複数のシェーダを使用できます。

注:一度に1つの質問をお試しください。ありがとうございました。 :)

+0

私の質問は、VAOを使用していない状況に関するものでした。私はちょうどVBOを使用しています。私はGL_MAX_VERTEX_ATTRIBSを取得し、サイズ、ストライド、タイプ、正規化フラグ、バッファバインディング、すべての頂点属性の配列ポインタを保存して保存する必要があると思います。次に、シェーダープログラムを再バインドした後、再びglVertexAttribPointerを使用して頂点属性値を設定します。それは正しいですか、私はどこか間違っていますか? –

+1

しかし、これらの属性を最初に設定したのは誰ですか?私は*あなた*があなたのプログラムのどこかに既にすべての情報を持っていると思うでしょう。あなたはVAOを実装するライブラリを構築しようとしていますか?どうして?すでにOpenGL 3.0と呼ばれているものがあります。 ;) –

+0

これらの値は、ライブラリを使用して設定されます。はい、あなたは正しいです私はVAOがあなたのために何をしているのか試しています。 opengl 2.0を使っている人なら、私はそれをする必要があります。私は私の質問を更新しました。見てください。私は –

2

現在、vboはバインドされています。

プログラムオブジェクトにはバッファがバインドされていません。 まで。プログラムオブジェクトが有するコンパイルされたプログラム以外の唯一の状態は、均一な状態である。

頂点配列はユニフォームではありません。

頂点データに使用されるバッファは、頂点配列オブジェクト(VAO)に格納できます。 VAOにアクセスできない場合は、そのバッファでレンダリングするたびにこの状態をリセットする必要があります。つまり、毎回glBindBuffer,glEnableVertexAttribArray、およびglVertexAttribPointerの呼び出しを行う必要があります。

これを回避するためにVAOが存在します。しかし、あなたがそれらにアクセスできない場合は、あなたはあなたが持っているもののために支払う必要があります。

関連する問題