diff --git a/qglengine/core/glframebuffer.cpp b/qglengine/core/glframebuffer.cpp index 786ccf2..c465bf0 100644 --- a/qglengine/core/glframebuffer.cpp +++ b/qglengine/core/glframebuffer.cpp @@ -217,14 +217,10 @@ void Framebuffer::blit(int index_from, GLuint fb_to, int index_to, QRect from, Q void Framebuffer::bind() { if (is_changed) resize(wid, hei); if (fbo == 0) return; - //glFlush(); f->glGetIntegerv(GL_VIEWPORT, prev_view); - //glClearError(); f->glBindFramebuffer(GL_FRAMEBUFFER, fbo); - //qDebug() << QString::number(glGetError(), 16); setWriteBuffers(); f->glReadBuffer(GL_COLOR_ATTACHMENT0); - //f->glDrawBuffer(GL_COLOR_ATTACHMENT0); f->glViewport(0, 0, wid, hei); } @@ -232,7 +228,6 @@ void Framebuffer::bind() { void Framebuffer::release() { is_changed = false; if (fbo == 0) return; - //glFlush(); f->glBindFramebuffer(GL_FRAMEBUFFER, 0); f->glViewport(prev_view[0], prev_view[1], prev_view[2], prev_view[3]); } @@ -245,7 +240,7 @@ void Framebuffer::setWriteBuffer(int index) { } -void Framebuffer::setWriteBuffers(int * indeces, int count) { +void Framebuffer::setWriteBuffers(const int * indeces, int count) { unsetWriteBuffers(); QVector buffers; for (int i = 0; i < count; ++i) diff --git a/qglengine/core/glframebuffer.h b/qglengine/core/glframebuffer.h index 4a1a4a7..34c0a27 100644 --- a/qglengine/core/glframebuffer.h +++ b/qglengine/core/glframebuffer.h @@ -57,7 +57,8 @@ public: void release(); void setReadBuffer(int index) {glReadBuffer(GL_COLOR_ATTACHMENT0 + index);} void setWriteBuffer(int index); - void setWriteBuffers(int * indeces, int count); + void setWriteBuffers(const int * indeces, int count); + void setWriteBuffers(const QVector & indeces) {setWriteBuffers(indeces.constData(), indeces.size());} void setWriteBuffers(); void unsetWriteBuffers(); //void setColorFormat(GLenum format) {color_format = format; is_changed = true;} diff --git a/qglengine/core/glshaders.cpp b/qglengine/core/glshaders.cpp index 909361f..870d627 100644 --- a/qglengine/core/glshaders.cpp +++ b/qglengine/core/glshaders.cpp @@ -29,7 +29,7 @@ bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QStr content.clear(); return true; } - //qDebug() << "[QGLView] Shader" << file << "found" << (QOpenGLShader::ShaderTypeBit)(int)type << "section ..."; + //qDebug() << "[QGLEngine] Shader" << file << "found" << (QOpenGLShader::ShaderTypeBit)(int)type << "section ..."; if (add_qgl) { switch (type) { case QOpenGLShader::Fragment: @@ -48,7 +48,7 @@ bool addShader(QOpenGLShaderProgram * prog, QOpenGLShader::ShaderType type, QStr content.prepend(defs); content.prepend(qgl_common_head); bool ret = prog->addShaderFromSourceCode(type, content.toLatin1()); - if (!ret) qDebug() << "[QGLView] Shader" << file << "Compile error:\n" << prog->log(); + if (!ret) qDebug() << "[QGLEngine] Shader" << file << "Compile error:\n" << prog->log(); content.clear(); return ret; } @@ -69,7 +69,7 @@ bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QStr prog->removeAllShaders(); QFile f(file); if (!f.open(QIODevice::ReadOnly)) { - qDebug() << "[QGLView] Shader" << file << "Error: can`t open file!"; + qDebug() << "[QGLEngine] Shader" << file << "Error: can`t open file!"; return false; } QTextStream ts(&f); @@ -109,10 +109,10 @@ bool QGLEngineShaders::loadShadersMulti(QOpenGLShaderProgram *& prog, const QStr } if (!addShader(prog, type, cur_shader, file, add_qgl, defs)) return false; if (!prog->link()) { - qDebug() << "[QGLView] Shader" << file << "Link error:\n" << prog->log(); + qDebug() << "[QGLEngine] Shader" << file << "Link error:\n" << prog->log(); return false; } - qDebug() << "[QGLView] Shader" << file << "ok"; + qDebug() << "[QGLEngine] Shader" << file << "ok"; return true; } @@ -131,16 +131,16 @@ bool QGLEngineShaders::loadShaders(QOpenGLShaderProgram *& prog, const QStringLi if (type == 0) continue; QFile file(f); if (!file.open(QIODevice::ReadOnly)) { - qDebug() << "[QGLView] Shader" << f << "Error: can`t open file!"; + qDebug() << "[QGLEngine] Shader" << f << "Error: can`t open file!"; return false; } cur_shader = file.readAll(); if (!addShader(prog, type, cur_shader, f, add_qgl, defs)) return false; } if (!prog->link()) { - qDebug() << "[QGLView] Shader" << files << "Link error:\n" << prog->log(); + qDebug() << "[QGLEngine] Shader" << files << "Link error:\n" << prog->log(); return false; } - qDebug() << "[QGLView] Shader" << files << "ok"; + qDebug() << "[QGLEngine] Shader" << files << "ok"; return true; } diff --git a/qglengine/qglview.h b/qglengine/qglview.h index 6e638bb..9b2ce13 100644 --- a/qglengine/qglview.h +++ b/qglengine/qglview.h @@ -49,7 +49,8 @@ class QGLView: public OpenGLWindow Q_PROPERTY (float lineWidth READ lineWidth WRITE setLineWidth) Q_PROPERTY (float FOV READ FOV WRITE setFOV) Q_PROPERTY (float depthStart READ depthStart WRITE setDepthStart) - Q_PROPERTY (float exposure READ exposure WRITE setExposure) + Q_PROPERTY (float gamma READ gamma WRITE setGamma) + Q_PROPERTY (bool autoExposure READ autoExposure WRITE setAutoExposure) Q_PROPERTY (QColor ambientColor READ ambientColor WRITE setAmbientColor) Q_PROPERTY (QColor fogColor READ fogColor WRITE setFogColor) Q_PROPERTY (bool fogEnabled READ isFogEnabled WRITE setFogEnabled) @@ -111,7 +112,8 @@ public: float FOV() const {return camera()->fov_;} float depthStart() const {return camera()->depth_start;} float currentFPS() const {return fps_;} - float exposure() const {return renderer_.exposure_;} + float gamma() const {return renderer_.gamma_;} + bool autoExposure() const {return renderer_.tone_proc.enabled;} int maxAnisotropicLevel() const {return max_anisotropic;} QColor ambientColor() const {return ambientColor_;} @@ -231,7 +233,8 @@ public slots: void setLineWidth(const float & arg) {lineWidth_ = arg;} void setFOV(const float & arg) {camera()->fov_ = arg;} void setDepthStart(const float & arg) {camera()->depth_start = arg;} - void setExposure(const float & arg) {renderer_.exposure_ = arg;} + void setGamma(const float & arg) {renderer_.gamma_ = arg;} + void setAutoExposure(bool arg) {renderer_.tone_proc.enabled = arg;} void setAmbientColor(const QColor & arg) {ambientColor_ = arg;} void setFogColor(const QColor & arg) {fogColor_ = arg;} void setFogDensity(const float & arg) {fogDensity_ = arg;} diff --git a/qglengine/qglview_test/qglview_window.h b/qglengine/qglview_test/qglview_window.h index 30e3d0f..841b70a 100644 --- a/qglengine/qglview_test/qglview_window.h +++ b/qglengine/qglview_test/qglview_window.h @@ -63,7 +63,7 @@ private: private slots: void on_spinFOV_valueChanged(double val) {view->view()->setFOV(val);} void on_spinDepthStart_valueChanged(double val) {view->view()->setDepthStart(val);} - void on_spinViewExposure_valueChanged(double val) {view->view()->setExposure(val);} + void on_spinViewGamma_valueChanged(double val) {view->view()->setGamma(val);} void on_comboViewRenderMode_currentIndexChanged(int val) {static int modes[] = {GL_POINT, GL_LINE, GL_FILL}; view->view()->setRenderMode((ObjectBase::RenderMode)modes[val]);} void on_groupHoverHalo_clicked(bool val) {view->view()->setHoverHaloEnabled(val);} void on_groupSelectionHalo_clicked(bool val) {view->view()->setSelectionHaloEnabled(val);} @@ -71,6 +71,7 @@ private slots: void on_spinSelectionHaloFill_valueChanged(double val) {view->view()->setSelectionHaloFillAlpha(val);} void on_colorHoverHalo_colorChanged(QColor color) {view->view()->setHoverHaloColor(color);} void on_colorSelectionHalo_colorChanged(QColor color) {view->view()->setSelectionHaloColor(color);} + void on_checkAutoExposure_toggled(bool val) {view->view()->setAutoExposure(val);} void on_checkFXAA_clicked(bool val) {view->view()->setFeature(QGLView::qglFXAA, val);} void on_colorBack_colorChanged(QColor color) {view->view()->setBackColor(color);} void on_colorAmbient_colorChanged(QColor color) {view->view()->setAmbientColor(color);} diff --git a/qglengine/qglview_test/qglview_window.ui b/qglengine/qglview_test/qglview_window.ui index d091dce..1eb8bc0 100644 --- a/qglengine/qglview_test/qglview_window.ui +++ b/qglengine/qglview_test/qglview_window.ui @@ -107,6 +107,22 @@ + + + + 3 + + + 999999999.000000000000000 + + + QAbstractSpinBox::AdaptiveDecimalStepType + + + 1.000000000000000 + + + @@ -175,37 +191,34 @@ - Exposure + Gamma - + 0.010000000000000 - 99.000000000000000 + 5.000000000000000 1.000000000000000 - 3 - - - true + 2 - + FXAA - + Hover halo @@ -260,7 +273,7 @@ - + Selection halo @@ -315,7 +328,7 @@ - + Camera @@ -344,16 +357,13 @@ - - - - 3 + + + + Auto exposure - - 999999999.000000000000000 - - - 1.000000000000000 + + true @@ -377,7 +387,7 @@ 0 0 - 960 + 951 737 @@ -1016,7 +1026,7 @@ 0 0 - 999 + 990 853 diff --git a/qglengine/renderer.cpp b/qglengine/renderer.cpp index 2a1399c..4656f89 100644 --- a/qglengine/renderer.cpp +++ b/qglengine/renderer.cpp @@ -68,7 +68,7 @@ Renderer::Renderer(QGLView * view_): RendererBase(view_), << ShaderPair("ssao_merge", &shader_ssao_merge) << ShaderPair("dof", &shader_dof);*/ shader_fxaa = 0; - exposure_ = 1.; + gamma_ = 1.; edit_mode = need_init_shaders = is_camera_light = true; } @@ -160,6 +160,9 @@ void Renderer::initShaders() { for (int i = 0; i < 5; ++i) prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i); } + if (bindShader(srGeometryPass, &prog)) { + setUniformMaps(prog); + } if (bindShader(srTonemapPass, &prog)) { prog->setUniformValue("tex_0", 0); prog->setUniformValue("tex_sum", 1); @@ -266,17 +269,16 @@ void Renderer::renderScene() { glEnableDepth(); glClearFramebuffer(); if (bindShader(srGeometryPass, &prog)) { - setUniformMaps(prog); setUniformCamera(prog, cam); textures_empty.bind(f, tarEmpty); textures_maps .bind(f, tarMaps ); renderObjects(scene, rpSolid); + renderObjects(scene, rpTransparent); } fbo_ds.release(); /// lighting passes fbo_ds.bindColorTextures(); - fbo_ds.bindDepthTexture(5); fbo_out.bind(); //int ri = 1, wi = 0; typedef QPair PassPair; @@ -293,6 +295,8 @@ void Renderer::renderScene() { renderQuad(prog, quad, cam); } } + + /// blending layers if (bindShader(srFinalPass, &prog)) { fbo_out.bindColorTexture(obrSolidOmni, 0); fbo_out.bindColorTexture(obrSolidSpot, 1); @@ -302,7 +306,7 @@ void Renderer::renderScene() { if (tone_proc.process()) fbo_out.bind(); if (bindShader(srTonemapPass, &prog)) { - prog->setUniformValue("exposure", exposure_); + prog->setUniformValue("gamma", gamma_); prog->setUniformValue("frame_max", tone_proc.frameMax()); //fbo_1x1.bindColorTexture(0, 1); fbo_out.bindColorTexture(obrSum, 0); diff --git a/qglengine/renderer.h b/qglengine/renderer.h index b72c981..0e75903 100644 --- a/qglengine/renderer.h +++ b/qglengine/renderer.h @@ -92,7 +92,7 @@ protected: void releaseShader(); private: - float exposure_; + float gamma_; bool edit_mode, need_init_shaders, is_camera_light, need_render_sum; Framebuffer fbo_ds, fbo_out; /*QOpenGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small; diff --git a/qglengine/renderer_selection.cpp b/qglengine/renderer_selection.cpp index 1073dc6..97c341d 100644 --- a/qglengine/renderer_selection.cpp +++ b/qglengine/renderer_selection.cpp @@ -142,8 +142,7 @@ void RendererSelection::renderSelection(Scene & scene) { //qDebug() << id_hover; fbo_selection.bindColorTexture(sbrSrcHover , sbrSrcHover ); fbo_selection.bindColorTexture(sbrSrcSelect, sbrSrcSelect); - int wind[2] = {sbrHovered, sbrSelected}; - fbo_selection.setWriteBuffers(wind, 2); + fbo_selection.setWriteBuffers(QVector() << sbrHovered << sbrSelected); if (!view->hoverHalo_ && !view->selectionHalo_) glClearFramebuffer(QColor(0,0,0,0), false); else { diff --git a/qglengine/tonemapping_proc.cpp b/qglengine/tonemapping_proc.cpp index ed47451..fedcedc 100644 --- a/qglengine/tonemapping_proc.cpp +++ b/qglengine/tonemapping_proc.cpp @@ -33,6 +33,7 @@ TonemappingProc::TonemappingProc(Renderer * rend): QThread(), r(rend), timer_delim = 0; frame_max = cur_max = 1.; need_render_sum = exit_ = false; + enabled = true; timer_tone = startTimer(10); } @@ -80,7 +81,7 @@ void TonemappingProc::resize() { void TonemappingProc::timerEvent(QTimerEvent * e) { - if (!fbo_1x1.isInit()) return; + if (!fbo_1x1.isInit() || !enabled) return; if (timer_delim == 0) need_render_sum = true; timer_delim = (timer_delim + 1) % 10; @@ -122,6 +123,10 @@ void TonemappingProc::renderSum(Framebuffer & fbo_src, int index) { void TonemappingProc::run() { while (!exit_) { + if (!enabled) { + msleep(100); + continue; + } mutex.lock(); if (last_data.isEmpty()) { mutex.unlock(); @@ -159,7 +164,7 @@ float TonemappingProc::calcHistogram(const QVector & data) { bool TonemappingProc::process() { - if (!need_render_sum) return false; + if (!need_render_sum || !enabled) return false; need_render_sum = false; Framebuffer & fbo(fbomm.lastPlane()); if (fbo.queriedPoints() > 0) { @@ -176,10 +181,6 @@ bool TonemappingProc::process() { float TonemappingProc::frameMax() { + if (!enabled) return 1.f; return cur_max; - /*mutex.lock(); - float ret = frame_max; - mutex.unlock(); - return ret;*/ - } diff --git a/qglengine/tonemapping_proc.h b/qglengine/tonemapping_proc.h index 0071948..a6f7c9c 100644 --- a/qglengine/tonemapping_proc.h +++ b/qglengine/tonemapping_proc.h @@ -26,6 +26,7 @@ class TonemappingProc: public QThread { friend class Renderer; + friend class QGLView; public: TonemappingProc(Renderer * rend); virtual ~TonemappingProc(); @@ -50,7 +51,7 @@ private: QVector last_max; float frame_max, cur_max; - bool need_render_sum; + bool need_render_sum, enabled; volatile bool exit_; int timer_tone, timer_delim; Framebuffer fbo_1x1;