c++ - When using IBO/EBO, program only works when I call glBindBuffer to bind the IBO/EBO AFTER creation of the VAO -


for reason, program works when bind ibo/ebo again, after create vao. read online, and multiple posts, glbindbuffer binds current buffer, , not attach the vao. thought glvertexattribpointer function attached data 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 bind buffer again, works   glenablevertexattribarray(0); glenablevertexattribarray(1); 

if did not have second glbindbuffer, program crashes. want know why have call glbindbuffer again, after create vao, when calling glbindbuffer makes buffer active buffer other functions.

pastebin (full code)

the problem order of initial calls. gl_element_array_buffer binding part of vao state. @ sequence:

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); 

since gl_element_array_buffer binding part of vao state, glbindvertexarray() call @ end of sequence establish gl_element_array_buffer buffer binding part of vao vao you're binding. which, since created vao, 0. @ end of sequence, have no element array buffer bound.

or, looking @ different direction, when make glbindbuffer(gl_element_array_buffer, ebo) call @ start, vao 0 bound. binding becomes part of state of vao 0. then, when bind different vao vao, lose binding, , replaced binding part of state of vao vao.

to make work expected, need make initial gl_element_array_buffer binding after bind vao. becomes part of vao state, , established again every time bind vao later:

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); 

Comments

Popular posts from this blog

Android : Making Listview full screen -

javascript - Parse JSON from the body of the POST -

javascript - Chrome Extension: Interacting with iframe embedded within popup -