java - How do I use Vertex Array Objects in OpenGL -
i'm using lwjgl 3 java wrapper opengl, , i'm trying figure out how render things vertex array objects. have not been able find examples online show how use vao has both shader attributes , uses element array buffer.
according this vao tutorial, need this:
// create new vertex array object in memory , select (bind) // vao can have 16 attributes (vbo's) assigned default vaoid = gl30.glgenvertexarrays(); gl30.glbindvertexarray(vaoid); // create new vertex buffer object in memory , select (bind) // vbo collection of vectors in case resemble location of each vertex. vboid = gl15.glgenbuffers(); gl15.glbindbuffer(gl15.gl_array_buffer, vboid); gl15.glbufferdata(gl15.gl_array_buffer, verticesbuffer, gl15.gl_static_draw); // put vbo in attributes list @ index 0 gl20.glvertexattribpointer(0, 3, gl11.gl_float, false, 0, 0); // deselect (bind 0) vbo gl15.glbindbuffer(gl15.gl_array_buffer, 0); // deselect (bind 0) vao gl30.glbindvertexarray(0); however, don't understand how adapt tutorial project, because using glvertexattribpointer deal fields in shader. these fields have id's assigned them when shader compiled. in above example, seem able use default field 0. however, checked, me posattrib in field 0.
how should associate vbo vao?
private int createvao(int shaderprogramid, floatbuffer vertices, intbuffer order) { int floatsize = 4; int stride = 7 * floatsize; int vaoid = glgenvertexarrays(); glbindvertexarray(vaoid); int vboid = glgenbuffers(); glbindbuffer(gl_array_buffer, vboid); glbufferdata(gl_array_buffer, vertices, gl_static_draw); int eboid = glgenbuffers(); glbindbuffer(gl_element_array_buffer, eboid); glbufferdata(gl_element_array_buffer, order, gl_static_draw); int posattrib = shaderprogramservice.getattribute(shaderprogramid, "position"); glenablevertexattribarray(posattrib); glvertexattribpointer(posattrib, 2, gl_float, false, stride, 0); int colattrib = shaderprogramservice.getattribute(shaderprogramid, "color"); glenablevertexattribarray(colattrib); glvertexattribpointer(colattrib, 3, gl_float, false, stride, 2 * floatsize); int texattrib = shaderprogramservice.getattribute(shaderprogramid, "texcoord"); glenablevertexattribarray(texattrib); glvertexattribpointer(texattrib, 2, gl_float, false, stride, 5 * floatsize); // glbindbuffer(gl_element_array_buffer, 0); <==== removed glbindbuffer(gl_array_buffer, 0); glbindvertexarray(0); return vaoid; } edit: @retokoradi, getting rid of glbindbuffer(gl_element_array_buffer, 0); call improved things. scene flashed onscreen, got seg-fault on second frame. after debugging, issue object trying render not yet using vao's. making calls render object:
glbindbuffer(gl_element_array_buffer, texturedpoints.geteboid()); glbindbuffer(gl_array_buffer, texturedpoints.getvboid()); glbindtexture(gl_texture_2d, texturedpoints.gettextureid()); specifyvertexattributes(); int count = texturedpoints.getcount(); gldrawelements(gl_triangles, count, gl_unsigned_int, 0); glbindtexture(gl_texture_2d, 0); glbindbuffer(gl_array_buffer, 0); glbindbuffer(gl_element_array_buffer, 0); somehow interfered subsequent vao rendering calls looked this:
glbindvertexarray(texturedpoints.getvaoid()); glbindtexture(gl_texture_2d, texturedpoints.gettextureid()); gldrawelements(gl_triangles, texturedpoints.getcount(), gl_unsigned_int, 0); the gldrawelements call seg-fault second time main loop went around , called it. after moving on vao's problems have gone away.
Comments
Post a Comment