c++ - OpenGL Offscreen Rendering Returning Clear Color -
c++ - OpenGL Offscreen Rendering Returning Clear Color -
i have simple function supposed take in existing texture nowadays in opengl , resize/downsize given width , height , homecoming id of new texture id.
it works fine first time , code can run multiple times (in loop) upon same source texture , resultant texture. 1 time frame has passed code no longer works. result 1 time function broken texture right width , height input not utilize input texture @ , output pixels of clear color used glclearcolor(0, 1, 1, 1);. using legacy opengl code display colored quad works 1 time , stops working leading me suggest problem not input texture geometry not beingness drawn in fbo.
gluint texture::downsample(int width, int height, gluint source) { // utilize largest values width = max(16, width); height = max(16, height); // create frame buffer object gluint fbo, rbo, target_texture; glgenframebuffers(1, &fbo); glbindframebuffer(gl_framebuffer, fbo); glgentextures(1, &target_texture); // create target texture glenum status; // : target texture : glbindtexture(gl_texture_2d, target_texture); // bind texture position unit used buffer gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_nearest); gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_nearest); gltexparameterf(gl_texture_2d, gl_texture_wrap_s, gl_clamp_to_edge); gltexparameterf(gl_texture_2d, gl_texture_wrap_t, gl_clamp_to_edge); glteximage2d(gl_texture_2d, 0, gl_rgb, width, height, 0, gl_rgba, gl_unsigned_short, null); glframebuffertexture2d(gl_framebuffer, gl_color_attachment0, gl_texture_2d, target_texture, 0); // setup framebuffer status = glcheckframebufferstatus(gl_framebuffer); if (status != gl_framebuffer_complete) throw; glgenrenderbuffers(1, &rbo); glbindrenderbuffer(gl_renderbuffer, rbo); glrenderbufferstorage(gl_renderbuffer, gl_depth_component, width, height); glframebufferrenderbuffer(gl_framebuffer, gl_depth_attachment, gl_renderbuffer, rbo); status = glcheckframebufferstatus(gl_framebuffer); if (status != gl_framebuffer_complete) throw; glbindframebuffer(gl_framebuffer, 0); glbindrenderbuffer(gl_renderbuffer, 0); glbindtexture(gl_texture_2d, 0); // utilize fbo draw color attachment glbindframebuffer(gl_draw_framebuffer, fbo); gldrawbuffer(gl_color_attachment0); glpushattrib(gl_viewport_bit | gl_color_buffer_bit); glviewport(0, 0, width, height); glclearcolor(0, 1, 1, 1); glclear(gl_color_buffer_bit | gl_depth_buffer_bit); gldisable(gl_depth_test); // : draw original texture glmatrixmode(gl_projection); glloadidentity(); glmatrixmode(gl_modelview); glloadidentity(); //this->bind(gl_texture0); glenable(gl_texture_2d); glactivetexture(gl_texture0); glbindtexture(gl_texture_2d, source); gltexparameteri(gl_texture_2d, gl_texture_wrap_s, gl_repeat); gltexparameteri(gl_texture_2d, gl_texture_wrap_t, gl_repeat); gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_linear); gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_linear); gldisable(gl_depth_test); // disable depth testing gldisable(gl_cull_face); // geometry info const float uvdata[] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; const float geometrydata[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f }; const unsigned char indices[] = { 0, 1, 2, 2, 3, 0 }; glenableclientstate(gl_vertex_array); // enable client vertex arrays glenableclientstate(gl_texture_coord_array); // enable client texture coordinate arrays glvertexpointer(3, gl_float, 0, &geometrydata[0]); // pass geometry info vertex array gltexcoordpointer(2, gl_float, 0, &uvdata[0]); // pass uv info texture coordinate array // draw geometry using indices gldrawelements(gl_triangles, 6, gl_unsigned_byte, indices); gldisableclientstate(gl_texture_coord_array); // disable client texture coordinate arrays gldisableclientstate(gl_vertex_array); // disable client vertex arrays glpopattrib(); gldeletetextures(1, &source); // delete old texture gldrawbuffer(gl_none); glbindframebuffer(gl_framebuffer, 0); glbindrenderbuffer(gl_renderbuffer, 0); glbindtexture(gl_texture_2d, 0); gldeleteframebuffers(1, &fbo); gldeleterenderbuffers(1, &rbo); glactivetexture(gl_texture0); glbindtexture(gl_texture_2d, target_texture); int w, h; int miplevel = 0; glgettexlevelparameteriv(gl_texture_2d, miplevel, gl_texture_width, &w); glgettexlevelparameteriv(gl_texture_2d, miplevel, gl_texture_height, &h); homecoming target_texture; }
found reply (as per usual 10 minutes after made question). running multi-context implementation of opengl. input texture id beingness used after function had returned, gpu had not finished processing.
just adding glfinish() before homecoming , creating mutex lock scenario worked charm. when texture accessed try-lock on mutex made determine if in utilize or not.
eg. mutex.instance.lock(); textureid_internal = downsample(128,128, textureid_internal); mutex.instance.unlock();
c++ opengl
Comments
Post a Comment