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

Popular posts from this blog

php - Calling a template part from a post -

Firefox SVG shape not printing when it has stroke -

How to mention the localhost in android -