c++ - Why does this vertex buffer object fails to Update? -
i have following pieces of code create vertex buffer object, initialize data, , render using glsl 4.0. however, when go update data stored in vertices after animation, opengl gives me error code 0x502 , not accept updated vertices information.
could point me in direction why these code not allow vertices information updated? should mention sometimes, data updated not consistent/predictable.
data structure used
struct vertex3{ glm::vec3 vtx; //0 glm::vec3 norm; //3 glm::vec3 tex; //6 use texturing or color }; vector<vertex3> geometry.vertices3;
initialization code
void solidus::mesh::initvbo(){ geometry.totalvertexcount = geometry.getvertexcount(); // allocate opengl vertex array object. glgenvertexarrays(1, &vertexarrayid); glgenbuffers(2,geometry.vboobjects); // bind vertex array object store buffers , vertex attributes create here. glbindvertexarray(vertexarrayid); glbindbuffer(gl_array_buffer, geometry.vboobjects[vertex_data]); //size size of total vtx gluint byte_size = gettotalsize(); //reserve inital space vertex data glbufferdata(gl_array_buffer, byte_size, null, gl_stream_draw); if(geometry.isstructvertex4()) initvbo4( ); else if(geometry.isstructvertex3()) initvbo3( ); else initvbo2( ); //release glbindvertexarray(0); geometry.vertices4.clear(); //geometry.vertices3.clear(); geometry.vertices2.clear(); } void solidus::mesh::initvbo3( ){ //gettotalsize() == getvtxcount() * sizeof(vertex3); glbuffersubdata(gl_array_buffer, 0, gettotalsize(), &geometry.vertices3[0]); //note: offsetof -- c++ standard library //note: glvertexattribpointer- first parameter location of glsl variable glenablevertexattribarray(0); // vertex4 position glvertexattribpointer( (gluint)0, 3, gl_float, gl_false, sizeof(vertex3), (glvoid*)offsetof(vertex3,vtx) ); // vertex4 normal glenablevertexattribarray(1); glvertexattribpointer( (gluint)1, 3, gl_float, gl_true, sizeof(vertex3), (glvoid*)offsetof(vertex3,norm) ); // texture coords glenablevertexattribarray(2); glvertexattribpointer( (gluint)2, 3, gl_float, gl_false, sizeof(vertex3),(glvoid*)offsetof(vertex3,tex) ); glbindbuffer(gl_element_array_buffer, geometry.vboobjects[index_data]); glbufferdata(gl_element_array_buffer, sizeof(gluint)*geometry.indices.size(), &geometry.indices[0], gl_static_draw); }
update mesh vertex information why fail
void solidus::mesh::uploadvertexglfx(){ glbindbuffer(gl_array_buffer, geometry.vboobjects[vertex_data]); string e0=""; if(geometry.isstructvertex2()){ solidus::glvbo::setvbosubdata(gettotalsize (), &geometry.vertices2[0]); e0="vertex2"; }else if(geometry.isstructvertex3()){ //this point of interest: @ least suspected!!!!! // getvtxcount() * sizeof(vertex3) = gettotalsize glbuffersubdata(gl_array_buffer, 0, gettotalsize (), &geometry.vertices3[0]); e0="vertex3"; }else { solidus::glvbo::setvbosubdata(gettotalsize (), &geometry.vertices4[0]); e0="vertex4"; } //report error glgeterror not equal 0 postmsg("failed upload vertex struct " + e0 , "uploadvertexglfx",30); glbindbuffer(gl_array_buffer, 0); }
i modified updatevertexglfx function code listed below. main difference after resupplied vertices information gl, informed opengl of pointer offset using gl*atribpointer. program reliably updates when call update function.
void solidus::mesh::uploadvertexglfx(){ glbindbuffer(gl_array_buffer, geometry.vboobjects[vertex_data]); string e0=""; if(geometry.isstructvertex2()){ solidus::glvbo::setvbosubdata(gettotalsize (), &geometry.vertices2[0]); e0="vertex2"; }else if(geometry.isstructvertex3()){ //glbufferdata(gl_array_buffer, gettotalsize (), null, gl_stream_draw); //this point of interest: @ least suspected!!!!! // getvtxcount() * sizeof(vertex3) = gettotalsize cout << "total size = " << gettotalsize() <<endl; cout << "vtx count = " << getvtxcount() << endl; cout << "sizeof(vertex3)=" <<sizeof(vertex3)<<endl; vertex3 *f = new vertex3[getvtxcount()]; for(int i=0; i<getvtxcount();i++){ f[i] = geometry.vertices3[i]; } glbufferdata(gl_array_buffer, gettotalsize(), null, gl_stream_draw); glbuffersubdata(gl_array_buffer, 0, gettotalsize (), f); //note: glvertexattribpointer- first parameter location of glsl variable glenablevertexattribarray(0); // vertex4 position glvertexattribpointer( (gluint)0, 3, gl_float, gl_false, sizeof(vertex3), (glvoid*)offsetof(vertex3,vtx) ); // vertex4 normal glenablevertexattribarray(1); glvertexattribpointer( (gluint)1, 3, gl_float, gl_true, sizeof(vertex3), (glvoid*)offsetof(vertex3,norm) ); // texture coords glenablevertexattribarray(2); glvertexattribpointer( (gluint)2, 3, gl_float, gl_false, sizeof(vertex3),(glvoid*)offsetof(vertex3,tex) ); delete f; f = nullptr; e0="vertex3"; }else { solidus::glvbo::setvbosubdata(gettotalsize (), &geometry.vertices4[0]); e0="vertex4"; } //report error glgeterror not equal 0 postmsg("failed upload vertex struct " + e0 , "uploadvertexglfx",30); glbindbuffer(gl_array_buffer, 0); }
Comments
Post a Comment