1

そこで、以前は頂点配列バッファー (コア プロファイル 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() を削除した後、コードで何を変更すればよいですか? 私が間違っていることは何ですか?

4

1 に答える 1

4

ユーザー生成の VAO の使用は、GL 3.x コア プロファイルでは必須です。3.3 コア仕様から、E2.2 で次の機能が削除されました。

クライアント頂点およびインデックス配列 - すべての頂点配列属性および要素配列インデックス ポインターは、バッファー オブジェクトを参照する必要があります。デフォルトの頂点配列オブジェクト (ゼロという名前) も非推奨です。バッファ オブジェクトまたは頂点配列オブジェクトがバインドされていない ときに VertexAttribPointer を呼び出すと、頂点配列オブジェクトがバインドされていないときに配列描画コマンドを呼び出すと同様に、INVALID_OPERATION エラーが生成されます。

于 2013-04-27T18:28:08.577 に答える