VAO(頂点配列オブジェクト)に関するすべてのチュートリアルで、頂点属性を構成し、VBO(頂点バッファーオブジェクト)をバインドすることにより、VAOの使用方法を示しています。しかし、各バッファーが同じデータパターン(頂点、uv、色など)を使用する固定シェーダーと組み合わせて、VBOのセット用に構成されるVAOを作成します。したがって、1つのシェーダーを使用して描画される複数のVBOに対して1つのVAOを作成します。
これに関するデモが見つからなかったため、試してみることにしました。しかし、それは機能せず、glDrawArray
呼び出し時にクラッシュします。VBOがバインドされていないようです。私が使用しているコードは次のとおりです。
レンダリング:
/* Prepare vertex attributes */
glBindVertexArrayOES(vao);
/* Upload the buffer to the GPU */
glBindBuffer(GL_ARRAY_BUFFER, pool->next());
glBufferSubData(GL_ARRAY_BUFFER, 0, parts * buffer.stride() * 6, buffer.getBuffer());
/* Draw the triangles */
glDrawArrays(GL_TRIANGLES, 0, parts * 6);
glBindVertexArrayOES(0);
VAO作成:
glBindVertexArrayOES(vao);
glEnableVertexAttribArray(ls.position);
glVertexAttribPointer(ls.position, 2, GL_FLOAT, GL_FALSE, buffer.stride(), 0);
glEnableVertexAttribArray(ls.color);
glVertexAttribPointer(ls.color, 3, GL_FLOAT, GL_FALSE, buffer.stride(), GL_BUFFER_OFFSET(buffer.dataTypeSize * 2));
glBindVertexArrayOES(0);
属性の場所を保持ls
するシンプルな場所はどこですかstruct
。
レンダリングの部分では、glBindBuffer
とそのglBindVertexArrayOES
周りを交換しても機能しませんでした。
だから、問題はそうすることさえ可能ですか、それとも各バッファにVAOを作成する必要がありますか?また、VBOごとにVAOを作成する必要がある場合、VAOとglBufferSubData
組み合わせて使用してVBOのデータを更新することはできますか?