diff --git a/qglview/mainwindow.h b/qglview/mainwindow.h index 689547f..edfda0c 100644 --- a/qglview/mainwindow.h +++ b/qglview/mainwindow.h @@ -74,6 +74,8 @@ private slots: void on_spinCubemapSize_valueChanged(double val) {view->setDynamicReflectionsMapSize(val);} void on_spinShadowmapSize_valueChanged(double val) {view->setShadowMapSize(val);} void on_spinHaloFillAlpha_valueChanged(double val) {view->setSelectionHaloFillAlpha(val);} + void on_spinMotionBlurFactor_valueChanged(double val) {view->setMotionBlurFactor(val);} + void on_spinMotionBlurSteps_valueChanged(int val) {view->setMotionBlurSteps(val);} //void on_spinSliderShine_valueChanged(double val) {obj->material().shine_strength = val; obj->setMaterial(obj->material(), true);} //void on_spinSliderRough_valueChanged(double val) {obj->material().shine = val; obj->setMaterial(obj->material(), true);} void on_pushButton_clicked() {view->removeLight(view->lightsCount() - 1); setWindowTitle(QString::number(view->lightsCount()));} @@ -92,6 +94,7 @@ private slots: void on_checkShadows_toggled(bool val) {view->setShadowsEnabled(val);} void on_checkSoftShadows_toggled(bool val) {view->setSoftShadowsEnabled(val);} void on_checkCameraOrbit_toggled(bool val) {view->setCameraOrbit(val);} + void on_checkMotionBlur_toggled(bool val) {view->setMotionBlurEnabled(val);} void on_colorAmbient_colorChanged(QColor color) {view->setAmbientColor(color);} void on_colorHalo_colorChanged(QColor color) {view->setSelectionHaloColor(color);} void on_view_glKeyPressEvent(QKeyEvent * e); diff --git a/qglview/mainwindow.ui b/qglview/mainwindow.ui index 857fa44..65dec03 100644 --- a/qglview/mainwindow.ui +++ b/qglview/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 1246 - 856 + 851 @@ -53,143 +53,217 @@ - - - FOV + + + QFormLayout::AllNonFixedFieldsGrow - - - - - - 0.100000000000000 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - 179.900000000000006 - - - 60.000000000000000 - - - - - - - accomodation time - - - - - - - 0.000000000000000 - - - 256.000000000000000 - - - 32.000000000000000 - - - true - - - - - - - accomodation max speed - - - - - - - 0.010000000000000 - - - 1.000000000000000 - - - 0.100000000000000 - - - 3 - - - 0.100000000000000 - - - 1.000000000000000 - - - true - - - - - - - dynamic cubemap size - - - - - - - 16.000000000000000 - - - 2048.000000000000000 - - - 512.000000000000000 - - - 0 - - - 16.000000000000000 - - - 512.000000000000000 - - - false - - - - - - - shadowmap size - - - - - - - 16.000000000000000 - - - 2048.000000000000000 - - - 512.000000000000000 - - - 0 - - - 16.000000000000000 - - - 512.000000000000000 - - - true - - + + + + FOV + + + + + + + 0.100000000000000 + + + 179.900000000000006 + + + 60.000000000000000 + + + + + + + accomodation time + + + + + + + accomodation max speed + + + + + + + dynamic cubemap size + + + + + + + shadowmap size + + + + + + + motion blur factor + + + + + + + motion blur steps + + + + + + + 0.000000000000000 + + + 256.000000000000000 + + + 32.000000000000000 + + + true + + + + + + + 0.010000000000000 + + + 1.000000000000000 + + + 0.100000000000000 + + + 3 + + + 0.100000000000000 + + + 1.000000000000000 + + + true + + + + + + + 16.000000000000000 + + + 2048.000000000000000 + + + 512.000000000000000 + + + 0 + + + 16.000000000000000 + + + 512.000000000000000 + + + false + + + + + + + 16.000000000000000 + + + 2048.000000000000000 + + + 512.000000000000000 + + + 0 + + + 16.000000000000000 + + + 512.000000000000000 + + + true + + + + + + + 0.000000000000000 + + + 10000.000000000000000 + + + 1.000000000000000 + + + 1 + + + 0.100000000000000 + + + 1.000000000000000 + + + false + + + + + + + 1.000000000000000 + + + 128.000000000000000 + + + 8.000000000000000 + + + 0 + + + 1.000000000000000 + + + 4.000000000000000 + + + false + + + + @@ -363,6 +437,13 @@ + + + + motion blur + + + @@ -502,6 +583,7 @@ 0 + tabWidget @@ -561,12 +643,12 @@ setEnabled(bool) - 92 - 580 + 112 + 611 - 91 - 605 + 111 + 632 @@ -577,12 +659,12 @@ setEnabled(bool) - 147 - 580 + 167 + 611 - 143 - 630 + 163 + 653 @@ -593,12 +675,12 @@ setEnabled(bool) - 106 - 705 + 126 + 737 - 108 - 730 + 128 + 758 diff --git a/qglview/qglview.cpp b/qglview/qglview.cpp index 6a9d57a..94c7c1e 100644 --- a/qglview/qglview.cpp +++ b/qglview/qglview.cpp @@ -57,8 +57,11 @@ QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) { cur_luminance = 1.; accom_time = 16.; accom_max_speed = 0.2; + m_motionBlurFactor = 1.; + m_motionBlurSteps = 8; mouse_first = mouseSelect_ = accomodation_ = hoverHalo_ = selectionHalo_ = true; - fogEnabled_ = is_init = grabMouse_ = mouseRotate_ = mouseThis_ = shaders_bind = shadows_ = shadows_soft = dynamic_reflections = hdr_ = bloom_ = msaa_ = fxaa_ = changed_ = false; + fogEnabled_ = is_init = grabMouse_ = mouseRotate_ = mouseThis_ = shaders_bind = m_motionBlurEnabled = + shadows_ = shadows_soft = dynamic_reflections = hdr_ = bloom_ = msaa_ = fxaa_ = changed_ = false; rmode = GLObjectBase::Fill; sel_mode = QGLView::SingleSelection; sel_pen = QPen(Qt::black, 1, Qt::DashLine); diff --git a/qglview/qglview.h b/qglview/qglview.h index 1bfc562..48b4f04 100644 --- a/qglview/qglview.h +++ b/qglview/qglview.h @@ -80,6 +80,9 @@ class QGLView: public QGraphicsView, public QGLViewBase Q_PROPERTY (bool accomodationEnabled READ isAccomodationEnabled WRITE setAccomodationEnabled) Q_PROPERTY (double accomodationTime READ accomodationTime WRITE setAccomodationTime) Q_PROPERTY (double accomodationMaxSpeed READ accomodationMaxSpeed WRITE setAccomodationMaxSpeed) + Q_PROPERTY (bool motionBlurEnabled READ isMotionBlurEnabled WRITE setMotionBlurEnabled) + Q_PROPERTY (double motionBlurFactor READ motionBlurFactor WRITE setMotionBlurFactor) + Q_PROPERTY (int motionBlurSteps READ motionBlurSteps WRITE setMotionBlurSteps) Q_PROPERTY (Qt::MouseButton selectionButton READ selectionButton WRITE setSelectionButton) Q_PROPERTY (Qt::KeyboardModifier selectionModifier READ selectionModifier WRITE setSelectionModifier) Q_PROPERTY (SelectionMode selectionMode READ selectionMode WRITE setSelectionMode) @@ -138,6 +141,7 @@ public: bool isSelectionHaloEnabled() const {return selectionHalo_;} QColor selectionHaloColor() const {return selectionHaloColor_;} double selectionHaloFillAlpha() const {return selectionHaloFill_;} + bool isMotionBlurEnabled() const {return m_motionBlurEnabled;} bool isShadowsEnabled() const {return shadows_;} bool isSoftShadowsEnabled() const {return shadows_soft;} bool isDynamicReflectionsEnabled() const {return dynamic_reflections;} @@ -152,6 +156,8 @@ public: double accomodationTime() const {return accom_time;} double accomodationMaxSpeed() const {return accom_max_speed;} + double motionBlurFactor() const {return m_motionBlurFactor;} + int motionBlurSteps() const {return m_motionBlurSteps;} void addObject(QGraphicsItem * o) {scene()->addItem(o);} void addObject(QWidget * o, Qt::WindowFlags f = Qt::Widget); @@ -256,11 +262,12 @@ private: Qt::KeyboardModifier sel_mod; GLRendererBase::RenderingParameters start_rp; double lineWidth_, linearFiltering_, accom_time, accom_max_speed, cur_luminance; - double fogDensity_, fogStart_, fogEnd_, fps_, fps_tm, hoverHaloFill_, selectionHaloFill_; - int timer, fps_cnt, sh_id_loc, shadow_map_size, dynamic_cubemap_size; + double fogDensity_, fogStart_, fogEnd_, fps_, fps_tm, hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor; + int timer, fps_cnt, sh_id_loc, shadow_map_size, dynamic_cubemap_size, motion_blur_steps, m_motionBlurSteps; bool is_init, fogEnabled_, lightEnabled_, grabMouse_, mouse_first, mouseRotate_, mouseSelect_, customMouseMove_; + bool shaders_supported, changed_, cameraOrbit_; bool hoverHalo_, selectionHalo_, mouseThis_, shaders_bind, shadows_, shadows_soft, selecting_; - bool shaders_supported, dynamic_reflections, hdr_, bloom_, msaa_, fxaa_, accomodation_, changed_, cameraOrbit_; + bool dynamic_reflections, hdr_, bloom_, msaa_, fxaa_, accomodation_, m_motionBlurEnabled; public slots: void setBackColor(const QColor & arg) {backColor_ = arg;} @@ -302,6 +309,9 @@ public slots: void setMultisamplingEnabled(const bool & arg) {msaa_ = arg;} void setFXAAEnabled(const bool & arg) {fxaa_ = arg;} void setAccomodationEnabled(const bool & arg) {accomodation_ = arg;} + void setMotionBlurEnabled(bool motionBlurEnabled) {m_motionBlurEnabled = motionBlurEnabled;} + void setMotionBlurFactor(double motionBlurFactor) {m_motionBlurFactor = motionBlurFactor;} + void setMotionBlurSteps(int motionBlurSteps) {m_motionBlurSteps = motionBlurSteps;} void reloadShaders() {if (renderer_ != 0) renderer_->reloadShaders(); reloadThisShaders();} void deselect() {sel_obj = 0;} diff --git a/qglview/renderer_deferred_shading.cpp b/qglview/renderer_deferred_shading.cpp index fa3ce31..7ad8af8 100644 --- a/qglview/renderer_deferred_shading.cpp +++ b/qglview/renderer_deferred_shading.cpp @@ -195,18 +195,22 @@ void RendererDeferredShading::renderScene() { piSwap(wi, ri); } - fbo_out.setWriteBuffer(wi); - glActiveTextureChannel(1); - glBindTexture(GL_TEXTURE_2D, fbo_g.colorTexture(4)); - shader_motion_blur->bind(); - shader_motion_blur->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4()); - shader_motion_blur->setUniformValue("dt", QVector2D(1. / fbo_out.width(), 1. / fbo_out.height())); - shader_motion_blur->setUniformValue("t0", 0); - shader_motion_blur->setUniformValue("ts", 1); - glDrawQuad(shader_motion_blur); - glActiveTextureChannel(0); - glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(wi)); - piSwap(wi, ri); + if (view.isMotionBlurEnabled()) { + fbo_out.setWriteBuffer(wi); + glActiveTextureChannel(1); + glBindTexture(GL_TEXTURE_2D, fbo_g.colorTexture(4)); + shader_motion_blur->bind(); + shader_motion_blur->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4()); + shader_motion_blur->setUniformValue("dt", QVector2D(1. / fbo_out.width(), 1. / fbo_out.height())); + shader_motion_blur->setUniformValue("t0", 0); + shader_motion_blur->setUniformValue("ts", 1); + shader_motion_blur->setUniformValue("factor", GLfloat(view.motionBlurFactor())); + shader_motion_blur->setUniformValue("steps", view.motionBlurSteps()); + glDrawQuad(shader_motion_blur); + glActiveTextureChannel(0); + glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(wi)); + piSwap(wi, ri); + } glReleaseShaders(); fbo_out.release(); diff --git a/qglview/shaders/motion_blur.frag b/qglview/shaders/motion_blur.frag index 1f830fc..23e4761 100644 --- a/qglview/shaders/motion_blur.frag +++ b/qglview/shaders/motion_blur.frag @@ -2,13 +2,13 @@ uniform sampler2D t0, ts; uniform vec2 dt; -uniform float factor; -uniform int steps = 16; +uniform float factor = 1.; +uniform int steps = 8; void main(void) { vec2 cdt = dt / steps; vec2 ct = qgl_FragTexture.xy; - vec3 speed = texture(ts, ct).rgb*1024; + vec3 speed = texture(ts, ct).rgb * 256 * factor; int hsteps = steps / 2; ct -= speed.xy * cdt * hsteps; vec3 scol = vec3(0);//texture(t0, ct).rgb;