4

2 つの異なるシェーダーを使用してレンダリングする 2つの異なる頂点バッファーを作成しています。2 番目の頂点バッファーをバインドするとすぐに、最初の頂点バッファーに格納したデータが破損または失われたように見えます。

次のように、頂点バッファーを 1 つだけ生成して描画すると、次のようになります。

glGenBuffers( 1, &vb1 ) ;
glBindBuffer( GL_ARRAY_BUFFER, vb1 ) ;

// fill it..
glBufferData( .. )

次に、 draw() ループで、

glUseProgram( shader1 ) ;
glBindBuffer( vb1 ) ; // make sure it is bound
glDrawArrays( ... )   // draw it

その後、正常に動作し、問題もエラーもありません(私はgl* 呼び出しのたびに glGettingLastError() を使用しているため、このコードは完全に問題ないようです)

ここで、2 番目の頂点バッファーを生成してバインドすると、最初の頂点バッファーが生成されてバインドされた後はいつでも、

// ran in init() -- then previously working code in draw() is broken
glGenBuffers( 1, &vb2 ) ;              // ok.. no problems with this line
glBindBuffer( GL_ARRAY_BUFFER, vb2 ) ; // spoils data in vb1?

glBindBufferこの新しく生成されvb2たバッファで呼び出すとすぐに、データvb1が完全にダンプまたは失われたようです。描画しようとするとvb1(そうではありませんvb2!)、このクラッシュが発生します:

ここに画像の説明を入力

私も配列を埋めましたGL_STATIC_DRAW

わかりません。別の頂点バッファーが作成されて初期化されても、これらの頂点バッファーはデータを保持するはずだと思っていましたか? ..私は何を間違っていますか?

4

1 に答える 1

4

この質問に対する答えは非常に微妙で、見つけるのが難しいことがわかりました。

標準の例で使用されている頂点配列宣言は必要ないと思いました。質問でそれらを省略したことがわかります。しかし、頂点配列オブジェクトを使用することは、インデックスを正しくバインドするために不可欠であることがわかりました。

たとえば、

// Make vertex array OBJECT, _this does not store any data!_
// A "vertex array object" is a bit like a display list in
// that it will just remember and repeat the function calls you make,
// with the values you make them with.
glGenVertexArraysOES( 1, &va ) ; // make vertex array OBJECT. NOT used
// to store data..

// Bind the vertex array
glBindVertexArrayOES( va ) ; // "start recording the calls I make.."

// Make a buffer for the vertex array (place to store the data)
glGenBuffers( 1, &vb ) ;     // make the vertex BUFFER (used to
// store the actual data)

// Make the vertex array buffer active
glBindBuffer( GL_ARRAY_BUFFER, vb ) ;

glEnableVertexAttribArray( ... ) ;  // REMEMBERED IN VAO (vertex array object)
glVertexAttribPointer( ... ) ;      // REMEMBERED IN VAO

glBufferData( .. ) ; // send data down to gpu, not remembered by vao

// "Stop remembering" calls to glBindBuffer( .. ) and glEnableVertexAttribArray( .. )
glBindVertexArrayOES( 0 ) ; // "stop recording"

ドロー時に、単純に:

glBindVertexArrayOES( va ) ; // runs ALL your glEnableVertexAttribArray() calls,
// as well as your glBindBuffer( .. ) call,

// now all that's left to do is draw
glDrawArrays( glDrawingStyle, 0, vertexCount );
于 2012-09-15T23:21:35.257 に答える