diff --git a/src/core/core/glframebuffer.cpp b/src/core/core/glframebuffer.cpp index df2d6ab..ee80704 100644 --- a/src/core/core/glframebuffer.cpp +++ b/src/core/core/glframebuffer.cpp @@ -227,7 +227,16 @@ void Framebuffer::blit(int index_from, GLuint fb_to, int index_to, QRect from, Q f->glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); f->glReadBuffer(GL_COLOR_ATTACHMENT0 + index_from); f->glDrawBuffers(1, &e); - f->glBlitFramebuffer(from.x(), from.y(), from.right(), from.bottom(), to.x(), to.y(), to.right(), to.bottom(), mask, filter); + f->glBlitFramebuffer(from.x(), + from.y(), + from.right() + 1, + from.bottom() + 1, + to.x(), + to.y(), + to.right() + 1, + to.bottom() + 1, + mask, + filter); } diff --git a/src/core/core/glframebuffer_mipmap.cpp b/src/core/core/glframebuffer_mipmap.cpp index ffe85c1..079ccd5 100644 --- a/src/core/core/glframebuffer_mipmap.cpp +++ b/src/core/core/glframebuffer_mipmap.cpp @@ -37,6 +37,12 @@ void FramebufferMipmap::setIndexFrom(int index) { } +void FramebufferMipmap::enablePixelBuffer() { + for (int i = 0; i < fbo.size(); ++i) + fbo[i]->enablePixelBuffer(); +} + + void FramebufferMipmap::resize() { QSize sz = src_fb.size(); for (int i = 0; i < fbo.size(); ++i) { diff --git a/src/core/core/glframebuffer_mipmap.h b/src/core/core/glframebuffer_mipmap.h index e469491..a3d1e4e 100644 --- a/src/core/core/glframebuffer_mipmap.h +++ b/src/core/core/glframebuffer_mipmap.h @@ -37,6 +37,7 @@ public: QRect rect(int level) const { return fbo[level]->rect(); } void setIndexFrom(int index); + void enablePixelBuffer(); void resize(); void create(); void reinit(); diff --git a/src/core/render/renderer.cpp b/src/core/render/renderer.cpp index 4c4297c..8ca428e 100644 --- a/src/core/render/renderer.cpp +++ b/src/core/render/renderer.cpp @@ -47,7 +47,9 @@ Renderer::Renderer(QGLView * view_) , rend_service(this) , rend_selection(this) , tone_proc(this) - , tex_env(view_, 512) { + , tex_env(view_, 512) + , img_mips(fbo_out, obrLighting, 4) + , img_f_mips(fbo_out, obrLighting, 4) { mat_norm_to_tex_coord.scale(0.5, 0.5); mat_norm_to_tex_coord.translate(1, 1); mat_proj_90 = glMatrixPerspective(90., 1., 0.1); @@ -137,6 +139,10 @@ void Renderer::init(int width, int height) { shadow_maps_omni.reinit(); depth_maps_cone.reinit(); depth_maps_omni.reinit(); + img_mips.reinit(); + img_f_mips.reinit(); + img_mips.enablePixelBuffer(); + img_f_mips.enablePixelBuffer(); resize(width, height); rend_mat.init(256, 256); rend_service.init(width, height); @@ -158,6 +164,8 @@ void Renderer::resize(int width, int height) { rend_selection.resize(width, height); fbo_ds.resize(width, height); fbo_out.resize(width, height); + img_mips.resize(); + img_f_mips.resize(); tone_proc.resize(); } @@ -712,12 +720,26 @@ void Renderer::renderScene() { /// grab framebuffer phase.begin("grab"); if (view->grabFormats().testFlag(gfImage)) { - fbo_out.queryImage(cur_write_plane); - last_img = fbo_out.getImage().mirrored(); + if (grab_mipmap == 0) { + fbo_out.queryImage(cur_write_plane); + last_img = fbo_out.getImage().mirrored(); + } else { + img_mips.setIndexFrom(cur_write_plane); + img_mips.create(); + img_mips.plane(grab_mipmap - 1).queryImage(0); + last_img = img_mips.plane(grab_mipmap - 1).getImage().mirrored(); + } } if (view->grabFormats().testFlag(gfFloat)) { - fbo_out.queryImageF(obrLighting); - last_img_f = fbo_out.getPointsFloat(); + if (grab_mipmap_f == 0) { + fbo_out.queryImage(obrLighting); + last_img_f = fbo_out.getPointsFloat(); + } else { + img_f_mips.setIndexFrom(obrLighting); + img_f_mips.create(); + img_f_mips.plane(grab_mipmap_f - 1).queryImageF(0); + last_img_f = img_f_mips.plane(grab_mipmap_f - 1).getPointsFloat(); + } } // qDebug() << last_img.size(); phase.end(); diff --git a/src/core/render/renderer.h b/src/core/render/renderer.h index 6f36c42..db6ccab 100644 --- a/src/core/render/renderer.h +++ b/src/core/render/renderer.h @@ -20,6 +20,7 @@ #define RENDERER_H #include "glcubemap.h" +#include "glframebuffer.h" #include "glframebuffereffectbase.h" #include "renderer_base.h" #include "renderer_material.h" @@ -134,6 +135,7 @@ protected: private: float gamma_ = 1.f; int camera_light_mode, cur_write_plane = 0, prev_write_plane = 0; + int grab_mipmap = 0, grab_mipmap_f = 0; bool edit_mode, need_init_shaders, need_render_sum, __reinit_debug; Framebuffer fbo_ds, fbo_out; QMap shader_files; @@ -160,6 +162,7 @@ private: QVector hcontent; QMap> cur_lights; QVector fb_effects; + FramebufferMipmap img_mips, img_f_mips; QImage last_img; QVector last_img_f; QString obr_defines, timings; diff --git a/src/core/view/qglview.cpp b/src/core/view/qglview.cpp index a0a41cf..94ed74f 100644 --- a/src/core/view/qglview.cpp +++ b/src/core/view/qglview.cpp @@ -285,6 +285,16 @@ void QGLView::restoreCamera(const QByteArray & ba) { } +void QGLView::setGrabImageMipmap(int level) { + renderer_.grab_mipmap = level; +} + + +void QGLView::setGrabImageFMipmap(int level) { + renderer_.grab_mipmap_f = level; +} + + void QGLView::setShadowMapSize(QSize sz) { shadow_map_size = sz; } diff --git a/src/core/view/qglview.h b/src/core/view/qglview.h index b5db605..a31b24a 100644 --- a/src/core/view/qglview.h +++ b/src/core/view/qglview.h @@ -164,6 +164,8 @@ public: void setGrabFormats(QFlags f) { grab_formats = f; } QImage getImage() const { return renderer_.getImage(); } QVector getImageF() const { return renderer_.getImageF(); } + void setGrabImageMipmap(int level); + void setGrabImageFMipmap(int level); void setShadowMapSize(QSize sz); void setTextureMapSize(QSize sz);