diff --git a/qglengine/qglview.cpp b/qglengine/qglview.cpp index e000119..efcb5f6 100644 --- a/qglengine/qglview.cpp +++ b/qglengine/qglview.cpp @@ -46,8 +46,7 @@ QGLView::QGLView(): OpenGLWindow(), renderer_(this), mouse(this) { fps_tm = fps_ = 0.; fogColor_ = Qt::darkGray; fogDensity_ = 0.; - fogDecay_1 = 0.1; - fogDecay_0 = fogDecay_2 = 0.; + fogDecay_ = 10.; hoverHaloFill_ = selectionHaloFill_ = 0.15f; //lmode = Simple; setFeature(qglFXAA, false); diff --git a/qglengine/qglview.h b/qglengine/qglview.h index 9b257fa..45c31b1 100644 --- a/qglengine/qglview.h +++ b/qglengine/qglview.h @@ -55,9 +55,7 @@ class QGLView: public OpenGLWindow Q_PROPERTY (QColor fogColor READ fogColor WRITE setFogColor) Q_PROPERTY (bool fogEnabled READ isFogEnabled WRITE setFogEnabled) Q_PROPERTY (float fogDensity READ fogDensity WRITE setFogDensity) - Q_PROPERTY (float fogDecayConst READ fogDecayConst WRITE setFogDecayConst) - Q_PROPERTY (float fogDecayLinear READ fogDecayLinear WRITE setFogDecayLinear) - Q_PROPERTY (float fogDecayQuadratic READ fogDecayQuadratic WRITE setFogDecayQuadratic) + Q_PROPERTY (float fogDecay READ fogDecay WRITE setFogDecay) Q_PROPERTY (int renderMode READ renderMode WRITE setRenderMode) Q_PROPERTY (bool grabMouse READ isGrabMouseEnabled WRITE setGrabMouseEnabled) Q_PROPERTY (bool mouseRotate READ isMouseRotateEnabled WRITE setMouseRotateEnabled) @@ -120,9 +118,7 @@ public: QColor ambientColor() const {return ambientColor_;} QColor fogColor() const {return fogColor_;} float fogDensity() const {return fogDensity_;} - float fogDecayConst() const {return fogDecay_0;} - float fogDecayLinear() const {return fogDecay_1;} - float fogDecayQuadratic() const {return fogDecay_2;} + float fogDecay() const {return fogDecay_;} bool isFogEnabled() const {return fogEnabled_;} bool isLightEnabled() const {return lightEnabled_;} bool isGrabMouseEnabled() const {return mouse.isGrabMouseEnabled();} @@ -224,7 +220,7 @@ private: QHash features_; QSize prev_size; float lineWidth_; - float fogDensity_, fps_, fps_tm, fogDecay_0, fogDecay_1, fogDecay_2; + float fps_, fps_tm, fogDensity_, fogDecay_; float hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor; int timer, fps_cnt, sh_id_loc, deleting_; bool is_first_draw, is_init, fogEnabled_, lightEnabled_; @@ -244,9 +240,7 @@ public slots: void setAmbientColor(const QColor & arg) {ambientColor_ = arg;} void setFogColor(const QColor & arg) {fogColor_ = arg;} void setFogDensity(const float & arg) {fogDensity_ = arg;} - void setFogDecayConst(const float & arg) {fogDecay_0 = arg;} - void setFogDecayLinear(const float & arg) {fogDecay_1 = arg;} - void setFogDecayQuadratic(const float & arg) {fogDecay_2 = arg;} + void setFogDecay(const float & arg) {fogDecay_ = arg;} void setFogEnabled(const bool & arg) {fogEnabled_ = arg;} void setLightEnabled(const bool & arg) {lightEnabled_ = arg;} void setGrabMouseEnabled(const bool & arg) {mouse.setGrabMouseEnabled(arg);} diff --git a/qglengine/qglview_test/qglview_window.h b/qglengine/qglview_test/qglview_window.h index 94d8fa7..420d6ad 100644 --- a/qglengine/qglview_test/qglview_window.h +++ b/qglengine/qglview_test/qglview_window.h @@ -122,11 +122,9 @@ private slots: void on_actionRotate_triggered(bool on); void on_actionScale_triggered(bool on); - void on_colorFogBack_colorChanged(const QColor & v) {view->view()->setFogColor(v);} - void on_spinFogDensity_valueChanged(double v) {view->view()->setFogDensity(v);} - void on_spinFogDecayConst_valueChanged(double v) {view->view()->setFogDecayConst(v);} - void on_spinFogDecayLinear_valueChanged(double v) {view->view()->setFogDecayLinear(v);} - void on_spinFogDecayQuadratic_valueChanged(double v) {view->view()->setFogDecayQuadratic(v);} + void on_colorFogBack_colorChanged(const QColor & v) {view->view()->setFogColor(v);} + void on_spinFogDensity_valueChanged(double v) {view->view()->setFogDensity(v);} + void on_spinFogDecay_valueChanged(double v) {view->view()->setFogDecay(v);} public slots: diff --git a/qglengine/qglview_test/qglview_window.ui b/qglengine/qglview_test/qglview_window.ui index a69791d..c8463cc 100644 --- a/qglengine/qglview_test/qglview_window.ui +++ b/qglengine/qglview_test/qglview_window.ui @@ -351,7 +351,11 @@ - + + + + + Camera @@ -380,10 +384,6 @@ - - - - @@ -395,16 +395,22 @@ Fog - - + + + QFormLayout::AllNonFixedFieldsGrow + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + Density: + + + + - - - - Density: - - - @@ -440,112 +446,40 @@ - + Decay: - - - - - - ^0: - - - - - - - 0.000000000000000 - - - 1.000000000000000 - - - 0.000000000000000 - - - 3 - - - 0.050000000000000 - - - 0.100000000000000 - - - 1.000000000000000 - - - - - - - ^1: - - - - - - - 0.000000000000000 - - - 1.000000000000000 - - - 0.100000000000000 - - - 3 - - - 0.050000000000000 - - - 0.100000000000000 - - - 1.000000000000000 - - - - - - - ^2: - - - - - - - 0.000000000000000 - - - 1.000000000000000 - - - 0.000000000000000 - - - 3 - - - 0.050000000000000 - - - 0.100000000000000 - - - 1.000000000000000 - - - - + + + + 0.000000000000000 + + + 9999.000000000000000 + + + 10.000000000000000 + + + 2 + + + 0.050000000000000 + + + 0.100000000000000 + + + true + + + 9999.000000000000000 + + diff --git a/qglengine/renderer.cpp b/qglengine/renderer.cpp index bb93aed..d2721d2 100644 --- a/qglengine/renderer.cpp +++ b/qglengine/renderer.cpp @@ -242,7 +242,7 @@ void Renderer::renderLight(int first_wr_buff) { prog->setUniformValue("lights_start", lights_start[pass.second]); prog->setUniformValue("lights_count", cur_lights[pass.second].size()); prog->setUniformValue("fog_color", view->fogColor_); - prog->setUniformValue("fog_decay", QVector3D(view->fogDecay_0, view->fogDecay_1, view->fogDecay_2)); + prog->setUniformValue("fog_decay", qMax(view->fogDecay_, 0.001f)); prog->setUniformValue("fog_density", view->fogDensity_); fbo_out.setWriteBuffer(first_wr_buff + pass.second); glClearFramebuffer(Qt::black, false); diff --git a/qglengine/shaders/ds_light.glsl b/qglengine/shaders/ds_light.glsl index a6d0a42..c360b4f 100644 --- a/qglengine/shaders/ds_light.glsl +++ b/qglengine/shaders/ds_light.glsl @@ -20,8 +20,7 @@ uniform sampler2D tex_0, tex_1, tex_2, tex_3, tex_4; uniform int lights_start, lights_count; uniform vec4 fog_color = vec4(0.5, 0.5, 0.5, 1); -uniform vec3 fog_decay = vec3(0, 0.1, 0); // [^0, ^1, ^2] -uniform float fog_density = 0; +uniform float fog_decay = 10, fog_density = 0; const vec3 luma = vec3(0.299, 0.587, 0.114); const float _pe = 2.4e-7; @@ -131,9 +130,10 @@ void main(void) { vec3 res_col = max(vec3(0), li * diffuse + si * specular + emission); float plen = length(pos.xyz); - float fog = clamp(dot(fog_decay, vec3(1, plen, plen*plen)) * fog_color.a * fog_density, 0, 1); + float fog = 1 - exp(-plen / fog_decay); + fog = clamp(fog * fog_color.a * fog_density, 0, 1); res_col = mix(res_col, fog_color.rgb, fog); qgl_FragColor = vec4(res_col, alpha); - //qgl_FragColor.rgb = vec3(z); + //qgl_FragColor.rgb = vec3(fog); }