c++ - Incorrect rendering results using VBO -
i'm attempting write simple voxelized terrain engine using heightmaps , chunked approach. wanted build separate mesh each chunk , load meshes separate vbos. i've prepared logic, don't seem vbo rendering work properly. prepared simple heightmap testing should render 2 lines of voxels 16x16x2 = 512 cubes 12 triangles each overall. problem result looks nil should - here's mean:
click it looks similar no matter how far zoom in or out or twist camera, lines move bit. here's how i'm trying this: constructing buffers paricular mesh represented cmesh class:
void cmesh::generatevertexbufferdata() { this->vertexbuffer = new gluint(); glgenbuffers(1,vertexbuffer); glbindbuffer(gl_array_buffer, *this->vertexbuffer); glbufferdata(gl_array_buffer, sizeof(glfloat)*meshvertexdata->size(),&meshvertexdata[0],gl_static_draw); this->vertexcount = meshvertexdata->size(); } void cmesh::generateindexbufferdata() { this->indexbuffer = new gluint(); glgenbuffers(1,this->indexbuffer); glbindbuffer(gl_element_array_buffer, *this->indexbuffer); glbufferdata(gl_element_array_buffer, sizeof(gluint)*meshindexdata->size(),&meshindexdata[0],gl_static_draw); this->indexcount = meshindexdata->size(); } rendering done geometrymanager class:
glpushmatrix(); prenderer->immediatecoloralpha(1.0f,1.0f,1.0f,1.0f); prenderer->setrendermode(gl_line); prenderer->translateworldmatrix(geometryposition.x*chunk::chunk_size, geometryposition.y*chunk::chunk_size, geometryposition.z*chunk::chunk_size); glbindbuffer(gl_array_buffer,*mesharray->at(geometryid)->getbuffer(vertex_buffer)); glenableclientstate(gl_vertex_array); glvertexpointer(3,gl_float,0,buffer_offset(0)); glbindbuffer(gl_element_array_buffer,*mesharray->at(geometryid)->getbuffer(index_buffer)); gldrawelements(gl_triangles,mesharray->at(geometryid)->indexcount,gl_unsigned_int,buffer_offset(0)); glpopmatrix(); have checked weather i'm calculating vertex positions correctly rendering them out points straight std::vector* meshvertexdata using simple immediate mode this:
for(int i=0; < mesharray->at(geometryid)->meshvertexdata->size(); i+=3) { glbegin(gl_points); glvertex3f(mesharray->at(geometryid)->meshvertexdata->at(i), mesharray->at(geometryid)->meshvertexdata->at(i+1), mesharray->at(geometryid)->meshvertexdata->at(i+2)); glend(); } and result seems correct. i'm stumped this, i'm not sure happens between populating vbo info , rendering makes does. humbly inquire help in matter, don't see doing wrong. approach flawed or i'm missing simple? if interested in helping me solving problem, needs more info i'm willing provide inquire me including total cmesh , geometrymanager code on pastebin.
after time spent debugging , testing suggested solutions have found bug. turns out std::vector look &meshvertexdata[0] not equal look &(meshvertexdata->at(0)). result wasn't allocating info in vbo correctly. changed glbufferdata allocation latter , code runs fine. hope larn mistakes. helping me insight!
c++ opengl vbo voxel
No comments:
Post a Comment