add grab output mipmap level feature
This commit is contained in:
@@ -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->glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
|
||||||
f->glReadBuffer(GL_COLOR_ATTACHMENT0 + index_from);
|
f->glReadBuffer(GL_COLOR_ATTACHMENT0 + index_from);
|
||||||
f->glDrawBuffers(1, &e);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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() {
|
void FramebufferMipmap::resize() {
|
||||||
QSize sz = src_fb.size();
|
QSize sz = src_fb.size();
|
||||||
for (int i = 0; i < fbo.size(); ++i) {
|
for (int i = 0; i < fbo.size(); ++i) {
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ public:
|
|||||||
QRect rect(int level) const { return fbo[level]->rect(); }
|
QRect rect(int level) const { return fbo[level]->rect(); }
|
||||||
void setIndexFrom(int index);
|
void setIndexFrom(int index);
|
||||||
|
|
||||||
|
void enablePixelBuffer();
|
||||||
void resize();
|
void resize();
|
||||||
void create();
|
void create();
|
||||||
void reinit();
|
void reinit();
|
||||||
|
|||||||
@@ -47,7 +47,9 @@ Renderer::Renderer(QGLView * view_)
|
|||||||
, rend_service(this)
|
, rend_service(this)
|
||||||
, rend_selection(this)
|
, rend_selection(this)
|
||||||
, tone_proc(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.scale(0.5, 0.5);
|
||||||
mat_norm_to_tex_coord.translate(1, 1);
|
mat_norm_to_tex_coord.translate(1, 1);
|
||||||
mat_proj_90 = glMatrixPerspective(90., 1., 0.1);
|
mat_proj_90 = glMatrixPerspective(90., 1., 0.1);
|
||||||
@@ -137,6 +139,10 @@ void Renderer::init(int width, int height) {
|
|||||||
shadow_maps_omni.reinit();
|
shadow_maps_omni.reinit();
|
||||||
depth_maps_cone.reinit();
|
depth_maps_cone.reinit();
|
||||||
depth_maps_omni.reinit();
|
depth_maps_omni.reinit();
|
||||||
|
img_mips.reinit();
|
||||||
|
img_f_mips.reinit();
|
||||||
|
img_mips.enablePixelBuffer();
|
||||||
|
img_f_mips.enablePixelBuffer();
|
||||||
resize(width, height);
|
resize(width, height);
|
||||||
rend_mat.init(256, 256);
|
rend_mat.init(256, 256);
|
||||||
rend_service.init(width, height);
|
rend_service.init(width, height);
|
||||||
@@ -158,6 +164,8 @@ void Renderer::resize(int width, int height) {
|
|||||||
rend_selection.resize(width, height);
|
rend_selection.resize(width, height);
|
||||||
fbo_ds.resize(width, height);
|
fbo_ds.resize(width, height);
|
||||||
fbo_out.resize(width, height);
|
fbo_out.resize(width, height);
|
||||||
|
img_mips.resize();
|
||||||
|
img_f_mips.resize();
|
||||||
tone_proc.resize();
|
tone_proc.resize();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -712,12 +720,26 @@ void Renderer::renderScene() {
|
|||||||
/// grab framebuffer
|
/// grab framebuffer
|
||||||
phase.begin("grab");
|
phase.begin("grab");
|
||||||
if (view->grabFormats().testFlag(gfImage)) {
|
if (view->grabFormats().testFlag(gfImage)) {
|
||||||
fbo_out.queryImage(cur_write_plane);
|
if (grab_mipmap == 0) {
|
||||||
last_img = fbo_out.getImage().mirrored();
|
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)) {
|
if (view->grabFormats().testFlag(gfFloat)) {
|
||||||
fbo_out.queryImageF(obrLighting);
|
if (grab_mipmap_f == 0) {
|
||||||
last_img_f = fbo_out.getPointsFloat();
|
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();
|
// qDebug() << last_img.size();
|
||||||
phase.end();
|
phase.end();
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#define RENDERER_H
|
#define RENDERER_H
|
||||||
|
|
||||||
#include "glcubemap.h"
|
#include "glcubemap.h"
|
||||||
|
#include "glframebuffer.h"
|
||||||
#include "glframebuffereffectbase.h"
|
#include "glframebuffereffectbase.h"
|
||||||
#include "renderer_base.h"
|
#include "renderer_base.h"
|
||||||
#include "renderer_material.h"
|
#include "renderer_material.h"
|
||||||
@@ -134,6 +135,7 @@ protected:
|
|||||||
private:
|
private:
|
||||||
float gamma_ = 1.f;
|
float gamma_ = 1.f;
|
||||||
int camera_light_mode, cur_write_plane = 0, prev_write_plane = 0;
|
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;
|
bool edit_mode, need_init_shaders, need_render_sum, __reinit_debug;
|
||||||
Framebuffer fbo_ds, fbo_out;
|
Framebuffer fbo_ds, fbo_out;
|
||||||
QMap<ShaderRole, QString> shader_files;
|
QMap<ShaderRole, QString> shader_files;
|
||||||
@@ -160,6 +162,7 @@ private:
|
|||||||
QVector<QVector3D> hcontent;
|
QVector<QVector3D> hcontent;
|
||||||
QMap<int, QList<Light *>> cur_lights;
|
QMap<int, QList<Light *>> cur_lights;
|
||||||
QVector<FramebufferEffectBase *> fb_effects;
|
QVector<FramebufferEffectBase *> fb_effects;
|
||||||
|
FramebufferMipmap img_mips, img_f_mips;
|
||||||
QImage last_img;
|
QImage last_img;
|
||||||
QVector<QVector4D> last_img_f;
|
QVector<QVector4D> last_img_f;
|
||||||
QString obr_defines, timings;
|
QString obr_defines, timings;
|
||||||
|
|||||||
@@ -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) {
|
void QGLView::setShadowMapSize(QSize sz) {
|
||||||
shadow_map_size = sz;
|
shadow_map_size = sz;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -164,6 +164,8 @@ public:
|
|||||||
void setGrabFormats(QFlags<Renderer::GrabFormat> f) { grab_formats = f; }
|
void setGrabFormats(QFlags<Renderer::GrabFormat> f) { grab_formats = f; }
|
||||||
QImage getImage() const { return renderer_.getImage(); }
|
QImage getImage() const { return renderer_.getImage(); }
|
||||||
QVector<QVector4D> getImageF() const { return renderer_.getImageF(); }
|
QVector<QVector4D> getImageF() const { return renderer_.getImageF(); }
|
||||||
|
void setGrabImageMipmap(int level);
|
||||||
|
void setGrabImageFMipmap(int level);
|
||||||
|
|
||||||
void setShadowMapSize(QSize sz);
|
void setShadowMapSize(QSize sz);
|
||||||
void setTextureMapSize(QSize sz);
|
void setTextureMapSize(QSize sz);
|
||||||
|
|||||||
Reference in New Issue
Block a user