0

For some reason, this program only works when I bind the IBO/EBO again, after I create the VAO. I read online, and multiple SO posts, that glBindBuffer only binds the current buffer, and that it does not attach it the the VAO. I thought the glVertexAttribPointer is the function that attached the data to the VAO.

float points[] = {

   -0.5f,  0.5f, 0.0f, // top left      = 0
    0.5f,  0.5f, 0.0f, // top right     = 1
    0.5f, -0.5f, 0.0f, // bottom right  = 2
   -0.5f, -0.5f, 0.0f, // bottom left   = 3

};

GLuint elements[] = {

    0, 1, 2,
    2, 3, 0,
};

// generate vbo (point buffer)
GLuint pb = 0;
glGenBuffers(1, &pb);
glBindBuffer(GL_ARRAY_BUFFER, pb);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);

// generate element buffer object (ibo/ebo)
GLuint ebo = 0;
glGenBuffers(1, &ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);

// generate vao
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);


glBindBuffer(GL_ARRAY_BUFFER, pb);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);


glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); // when I bind buffer again, it works


glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);

If I did not have the second glBindBuffer, the program crashes. All I want to know is why I have to call glBindBuffer again, after I create the VAO, when calling glBindBuffer only makes the buffer the active buffer for other functions.

Pastebin (FULL CODE)

4

2 に答える 2

2

問題は、最初の呼び出しの順序にあります。GL_ELEMENT_ARRAY_BUFFERバインディングは、VAO 状態の一部です。このシーケンスを見てください:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);

GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

GL_ELEMENT_ARRAY_BUFFERバインディングは VAO 状態の一部であるため、glBindVertexArray()シーケンスの最後の呼び出しは、GL_ELEMENT_ARRAY_BUFFERバインドしている VAO の一部であるバッファー バインディングを確立しvaoます。を作成したのでvao、これは です0。したがって、このシーケンスの最後では、要素配列バッファーはバインドされていません。

というか、glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)逆に言えば、最初にコールするとVAO0がバインドされます。したがって、このバインディングは VAO の状態の一部になり0ます。次に、別の VAO をバインドすると、バインドvaoが失われ、 VAO の状態の一部であるバインドに置き換えられvaoます。

これを期待どおりに機能させるには、VAO をバインドしたGL_ELEMENT_ARRAY_BUFFERに最初のバインドを行う必要があります。その後、VAO 状態の一部になり、後で VAO をバインドするたびに再度確立されます。

GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
于 2015-07-02T15:22:27.413 に答える
-2

仕様を見ると、Vertex Array Object ステートには Element Buffer Object が含まれていません。

実際、VAO を有効にしても要素の bindibg ポイントは設定されません。

于 2015-07-02T05:32:41.353 に答える