そこで、以前は頂点配列バッファー (コア プロファイル 3.3) を使用し、次のようにセットアップしました。
int offset = 0;
glGenVertexArrays(1, &m_vba);
glBindVertexArray(m_vba);
glGenBuffers(1, &m_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, TOTAL_DATA_SIZE, nullptr, GL_STATIC_DRAW);
// Vertex data
glBufferSubData(GL_ARRAY_BUFFER, offset, VERTEX_DATA_SIZE, vertices);
offset += VERTEX_DATA_SIZE;
// Normal data
glBufferSubData(GL_ARRAY_BUFFER, offset, NORMAL_DATA_SIZE, normals);
offset += NORMAL_DATA_SIZE;
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, reinterpret_cast<GLvoid *>(VERTEX_DATA_SIZE));
私はインデックスバッファを使用していません。次のようにレンダリングします。
glBindVertexArray(m_vba);
glDrawArrays(GL_TRIANGLES, 0, NUM_VERTICES);
これは完全にうまくいきました。ただし、glGenVertexArrays() が Android などで利用できない可能性があることがわかりました。したがって、私はそれを削除し始めました。そして、私を夢中にさせている問題があります。
次のようにデータ初期化からvbaのものを削除すると:
int offset = 0;
glGenBuffers(1, &m_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, TOTAL_DATA_SIZE, nullptr, GL_STATIC_DRAW);
// Vertex data
glBufferSubData(GL_ARRAY_BUFFER, offset, VERTEX_DATA_SIZE, vertices);
offset += VERTEX_DATA_SIZE;
// Normal data
glBufferSubData(GL_ARRAY_BUFFER, offset, NORMAL_DATA_SIZE, normals);
offset += NORMAL_DATA_SIZE;
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, reinterpret_cast<GLvoid *>(VERTEX_DATA_SIZE));
..そして、次のようにレンダリングします。
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, reinterpret_cast<GLvoid *>(VERTEX_DATA_SIZE));
glDrawArrays(GL_TRIANGLES, 0, NUM_VERTICES);
..黒い画面しか表示されません。そして、私が理解していないことは、コードのどこかに追加すると、たとえばデータのセットアップ後に次のようになることです。
GLuint foo;
glGenVertexArrays(1, &foo);
glBindVertexArray(foo);
その後、すべてが再び正しくレンダリングされます。これを引き起こす副作用はありますか?セットアップ後にこの「foo」バッファーをバインドしません。複数のオブジェクトが独自の同様のバッファーで順次レンダリングされているにもかかわらず、引き続き機能します。
どうやら物事は私の予測どおりには進まない :) 質問は、glGenVertexArrays() を削除した後、コードで何を変更すればよいですか? 私が間違っていることは何ですか?