Saturday 15 March 2014

c++ - access violatoin when my program has two different QGLWidgets -



c++ - access violatoin when my program has two different QGLWidgets -

i have 2 different qglwidgets(glviwer , textureviwer),and add together them 2 qhboxlayout

glviewer = glviewer::getinstance(); //qglwidget singleton, display 3d model texviewer = textureviewer::getinstance();//display selected texture ui.modelviewer->addwidget(glviewer); //add qhboxlayout ui.textureviewer->addwidget(texviewer);

i render model gldrawarrays() because fast.i have no problems when have glviewer display 3d model. when have 2 qglwidget. cause problem.

access violation reading location 0x00000000...

i seek render model step step(draw triangle , another...), works without texture though phone call gltexcoord2f().

i have no thought why happens. help me please:)

following init info code

glgenbuffers(3, this->buffers); glbindbuffer(gl_array_buffer, this->buffers[vertexbuffer]); glbufferdata(gl_array_buffer, sizeof(glfloat)*9*objinfo->faces.size(), this->vertexs, gl_static_draw); glvertexpointer(3, gl_float, 0, buffer_offset(0)); glbindbuffer(gl_array_buffer, this->buffers[normalbuffer]); glbufferdata(gl_array_buffer, sizeof(glfloat)*9*objinfo->faces.size(), this->normals, gl_static_draw); glnormalpointer(gl_float, 0, buffer_offset(0)); glbindbuffer(gl_array_buffer, this->buffers[texcoordbuffer]); glbufferdata(gl_array_buffer, sizeof(glfloat)*6*objinfo->faces.size(), this->texcoord, gl_static_draw); gltexcoordpointer(2, gl_float, 0, buffer_offset(0));

buffer_offset(0) reddish book

#define buffer_offset(bytes) ((glubytes*) null+(bytes))

glviewer.h

class glviewer : public qglwidget { q_object public: ~glviewer(); glviewer(qwidget *parent = 0); void drawmodelwithtexarraybuffer(); protected: void initializegl(); void paintgl(); void resizegl(int w, int h); };

glviewer.cpp

void glviewer::initializegl() { glewinit(); glclearcolor(0.0f, 0.0f, 0.0f, 1.0f); glenable(gl_cull_face); glenable(gl_depth_test); glcullface(gl_back); glfrontface(gl_ccw); glshademodel(gl_smooth); } void glviewer::paintgl() { glclear(gl_color_buffer_bit | gl_depth_buffer_bit); if (isloaded) { timecount.start(); glloadidentity(); gltranslated(modelcenter[0]+offsetx-(maxx+minx)/2,modelcenter[1]+ offsety-(maxy+miny)/2 ,modelcenter[2]+zoomrate+minz-3*(maxz - minz)); glmultmatrixf(this->arcball->transform.m); gltranslated(-modelcenter[0], -modelcenter[1], -modelcenter[2]); if (this->modelwithttex) { setlight(this->lighton); if (showmesh) { drawmodellinearraybuffer(); } else { drawmodelwithtexarraybuffer(); //drawmodelwithtex(); } } else { drawmodelwithouttexarraybuffer(); } int elapsetime = timecount.elapsed(); } } void glviewer::resizegl( int w, int h ) { if (h == 0) { h = 1; } this->curwidth = w; this->curheight = h; glviewport(0, 0, (glsizei) w, (glsizei) h); glmatrixmode(gl_projection); glloadidentity(); gluperspective(60.0, (glfloat) w/(glfloat) h, 1, 2000.0); glmatrixmode(gl_modelview); glloadidentity(); this->arcball->setbounds((glfloat)w, (glfloat)h); } void glviewer::drawmodelwithtexarraybuffer() { glpolygonmode(gl_front_and_back, gl_fill); glenable(gl_texture_2d); gltexenvf(gl_texture_env, gl_texture_env_mode, gl_modulate); glenableclientstate(gl_vertex_array); glenableclientstate(gl_normal_array); glenableclientstate(gl_texture_coord_array); (int = 0 ; < objinfo->tex_filenames.size(); i++) { if (indrange[i].length == 0) continue; else { glbindtexture(gl_texture_2d, texname[indrange[i].texid]); gldrawarrays(gl_triangles, indrange[i].start, indrange[i].length); } } gldisable(gl_texture_2d); gldisableclientstate(gl_vertex_array); gldisableclientstate(gl_normal_array); gldisableclientstate(gl_texture_coord_array); }

textureviewer.h

class textureviewer : public qglwidget { q_object public: ~textureviewer(); textureviewer(qwidget *parent = 0); protected: void initializegl(); void paintgl(); void resizegl(int w, int h); };

textureviewer.cpp

void textureviewer::initializegl() { std::cout << "ddd" << std::endl; glewinit(); glclearcolor(0.0f, 0.0f, 0.0f, 1.0f); glenable(gl_cull_face); glenable(gl_depth_test); glcullface(gl_back); glfrontface(gl_ccw); glshademodel(gl_smooth); } void textureviewer::paintgl() { glclear(gl_color_buffer_bit | gl_depth_buffer_bit); glloadidentity(); gltranslated(0, 0, -1); glcolor4f(1, 0, 1, 1); glrectd(0,0,1,1); } void textureviewer::resizegl( int w, int h ) { if (h == 0) { h = 1; } glviewport(0, 0, (glsizei) w, (glsizei) h); glmatrixmode(gl_projection); glloadidentity(); gluperspective(60.0, (glfloat) w/(glfloat) h, 1, 2000.0); glmatrixmode(gl_modelview); glloadidentity(); }

each qglwidget has own opengl context , hence state, if create them shared context, things vertex array pointer locations not covered sharing. hence must create proper gl…pointer calls before calling gldrawelements or gldrawarrays. don't properly.

c++ qt opengl qglwidget

No comments:

Post a Comment