0

VBO について学んだ後、ある友人から、立方体のインデックスを頂点にリンクするために VAO を使用してみるように言われました。私は見つけることができるすべてのチュートリアルについて、役に立たなかった. バッファが正しくバインドされているように見え、描画しようとするまですべてが機能します。

これは私がVAOを生成する方法です -

glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);

glEnableVertexAttribArray(0);

glGenBuffers(1, &cubeIndex);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeIndex);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36 * sizeof(GLuint), cubeIndices, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_UNSIGNED_INT, GL_FALSE, sizeof(GLuint)*3, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

glEnableVertexAttribArray(1);

glGenBuffers(1, &cubeVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeVBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 21 * sizeof(GLfloat), cubeVertPoints, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*3, 0);

glBindVertexArray(0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

レンダリング -

glEnableClientState(GL_VERTEX_ARRAY);
glBindVertexArray(VAO);

glDrawArrays(GL_TRIANGLES, 0, size);//Runtime exception here if anything larger that '2' is provided?

glBindVertexArray(0);
4

1 に答える 1

1

あなたのコードは意味がありません。に何もバインドしないGL_ARRAY_BUFFERため、 glVertexAttribPointer()呼び出しは無効な VBO を指します。これを描画しようとすると、クラッシュが発生します。

ここで何をしようとしているのかわかりません。cubeIndexインデックス付きレンダリングの要素配列であると思われます。しかし、インデックスを頂点属性として使用しようとしているようです。しかし、それを(すでに行っているように) (何をしていないかGL_EMEMENT_ARRAY_BUFFER) と組み合わせて使用​​する必要があります。glDrawElements()あなたcubeVBOは である必要がありGL_ARRAY_BUFFER、それを頂点属性として使用する必要があります。

配列のサイズも奇妙に思えます。36 Uint は、それぞれ 6 つの辺と 2 つの三角形を持つ立方体を描画する場合、インデックス バッファーとして意味があります。しかし、ベクトルごとに 3 つのコンポーネントを持つ頂点データの 21 個の float は、7 個の頂点にすぎません。立方体では奇妙です。

OpenGL wikiのVertex SpecificationおよびVertex Renderingページを参照するか、いくつかのチュートリアルを参照してください。これまでに投稿したコードを見ると、基本的な概念を理解していないと思います。

于 2014-02-16T18:11:11.293 に答える