c++ - problem in rendering triangles in Opengl-es 2.0 -


possible duplicate:
problem when going opengl 1.1 opengl-es 2.0

i trying render isosurface drawing triangles takes data text file , render using opengl-es 2.0 . able in opengl 1.1 because in opengl-es 2.0 functions not present getting difficulty in buffer or may other problem not able understand . pasting both draw triangle code opengl , opengl-es 2.0 . can tell me why not able same result . doing coding in ubuntu 10.10 use of pvrsdk.

opengl-es 2.0 code :

    (surfnum=0;surfnum<surftotal;surfnum++)     {         glclearcolor(0.6f, 0.8f, 1.0f, 1.0f);         (i=0;i<trinum[surfnum];i++)         {             glfloat *vertices[] = {                                 triarray[surfnum][i].pt1,                              triarray[surfnum][i].pt2,                             triarray[surfnum][i].pt3                         };               glgenbuffers(1, &ui32vbo);             glbindbuffer(gl_array_buffer, ui32vbo);             unsigned int uisize = 3 * (sizeof(glfloat) * 3);              glbufferdata(gl_array_buffer, uisize,*vertices, gl_dynamic_draw);          }          for(int = 0; < 8000; ++i)         {             glclear(gl_color_buffer_bit);             int i32location = glgetuniformlocation(uiprogramobject, "projmatrix");             gluniformmatrix4fv( i32location, 1, gl_false, projmatrix);             glenablevertexattribarray(vertex_array);             glvertexattribpointer(vertex_array, 3, gl_float, gl_false, 0, 0);             //gldrawelements(gl_triangle_fan, trinum[surfnum], gl_unsigned_byte,vertices);             gldrawarrays(gl_triangles,0,trinum[surfnum]);             eglswapbuffers(egldisplay, eglsurface);         }     } 

same thing have done in opengl : opengl code :

for (surfnum=0;surfnum<surftotal;surfnum++) {     (i=0;i<trinum[surfnum];i++)     {         glbegin(gl_triangles);         glvertex3fv(triarray[surfnum][i].pt1);         glvertex3fv(triarray[surfnum][i].pt2);         glvertex3fv(triarray[surfnum][i].pt3);         glend();         glflush();         glutswapbuffers();     } } 

surfnum , vertex_array , surftotal defined variables. getting result not same both , getting warnig : libegl : software fallback

p.s = here if try first vertices , try bind in single buffer gives segmentation fault . may doing wrong . if thats correct way can tell me how . if want other information tell me.

hi christian said can without using glmapbuffer try still gives me error:

glgenbuffers(surftotal, uivbo); {     for(surfnum=0; surfnum<surftotal; ++surfnum)     {             glbindbuffer(gl_array_buffer, uivbo[surfnum]);             size_t buf_size = 9*sizeof(glfloat)*trinum[surfnum];             glfloat* const pdata = (glfloat*)malloc(buf_size);             for(i=0; i<trinum[surfnum]; ++i) {                 memcpy(pdata+i*9,   triarray[surfnum][i].pt1, 3*sizeof(glfloat));                 memcpy(pdata+i*9+3, triarray[surfnum][i].pt2, 3*sizeof(glfloat));                 memcpy(pdata+i*9+6, triarray[surfnum][i].pt3, 3*sizeof(glfloat));             }             glbufferdata(gl_array_buffer, buf_size, pdata, gl_static_draw);             free(pdata);     }        glbindbuffer(gl_array_buffer, 0);     glenablevertexattribarray(vertex_array);     for(surfnum=0; surfnum<surftotal; ++surfnum)     {             glbindbuffer(gl_array_buffer, uivbo[surfnum]);             glvertexattribpointer(vertex_array, 3, gl_float, gl_false, 0, 0);             gldrawarrays(gl_triangles, 0, 3*trinum[surfnum]);     }     glbindbuffer(gl_array_buffer, 0);        //clean up, of course        } 

thats error getting while compiling above program

libegl warning: use software fallback

first, don't create buffer in drawing function (which supposed run often), in initialization code (e.g. after loading data file), suppose won't change after loaded file (and if yes, update buffer data). second, don't make buffer every triangle, single 1 triangles (or maybe surftotal buffers, 1 each surface).

so first create surftotal buffers, not in draw routine:

gluint uivbo[surftotal]; glgenbuffers(surftotal, uivbo); 

next copy data (only when changed, maybe once after loading, if that's case, gl_static_draw might better). each triangle need store position data of 3 vertices, making 9 floats per triangle (your code quite messed up, storing addresses of vertices or not that). allocate storage buffer without giving data , map buffer data write directly it. way don't need allocate temporary cpu memory our data ourselves (the driver us). of course unmap after copying data, buffer can used rendering:

for(surfnum=0; surfnum<surftotal; ++surfnum) {     glbindbuffer(gl_array_buffer, uivbo[surfnum]);     glbufferdata(gl_array_buffer, 9*sizeof(glfloat)*trinum[surfnum], null, gl_dynamic_draw);     glfloat *pdata = glmapbuffer(gl_array_buffer, gl_write_only);     for(i=0; i<trinum[surfnum]; ++i,pdata+=9)     {         mempcy(pdata, triarray[surfnum][i].pt1, 3*sizeof(glfloat));         mempcy(pdata+3, triarray[surfnum][i].pt2, 3*sizeof(glfloat));         mempcy(pdata+6, triarray[surfnum][i].pt3, 3*sizeof(glfloat));     }     glunmapbuffer(gl_array_buffer); } glbindbuffer(gl_array_buffer, 0);      //clean behind 

when rendering data, bind buffer, tell opengl source vertex data , render (giving gldrawarrays number of vertices , not triangles). of course each surface:

glenablevertexattribarray(vertex_array); for(surfnum=0; surfnum<surftotal; ++surfnum) {     glbindbuffer(gl_array_buffer, uivbo[surfnum]);     glvertexattribpointer(vertex_array, 3, gl_float, gl_false, 0, 0);     gldrawarrays(gl_triangles, 0, 3*trinum[surfnum]); } glbindbuffer(gl_array_buffer, 0);        //clean up, of course 

it may better idea pack surface's triangles single buffer draw surfaces single draw call. may idea consider indexed triangle sets using gldrawelements , gl_element_array_buffer, suppose data structure doesn't have information , first should understand how arrays , buffers work before complicating things more (i hope answer helps that). try understand each , every line of answer code does, querying other sources of documentation if needed. in general, don't learn such complex things opengl or 3d graphics in general staring @ code samples, real documentation , learning resources, understand doing.


Comments

Popular posts from this blog

c# - SharpSVN - How to get the previous revision? -

c++ - Is it possible to compile a VST on linux? -

url - Querystring manipulation of email Address in PHP -