これは、画面に描画する単純なコードです。
GLuint vbo;
glGenBuffers(1, &vbo);
glUseProgram(myProgram);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
//Fill up my VBO with vertex data
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexes), &vertexes, GL_STATIC_DRAW);
/*Draw to the screen*/
これはうまくいきます。ただし、いくつかの GL 呼び出しの順序を次のように変更してみました。
GLuint vbo;
glGenBuffers(1, &vbo);
glUseProgram(myProgram);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
//Now comes after the setting of the vertex attributes.
glBindBuffer(GL_ARRAY_BUFFER, vbo);
//Fill up my VBO with vertex data
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexes), &vertexes, GL_STATIC_DRAW);
/*Draw to the screen*/
これにより、プログラムがクラッシュします。GL_ARRAY_BUFFER
頂点アトリビュートを設定するだけなのに、VBO をバインドする必要があるのはなぜですか? 私にとっては、glVertexAttribPointer
OpenGL が最終的に描画に使用する頂点の形式を設定するだけです。これは VBO に固有のものではありません。したがって、複数の VBO が同じ頂点フォーマットを使用したい場合、VBO 内の頂点を再度フォーマットする必要はありません。