From 11853c0feda56e83a3c38a1e3ccbb03f9839ed5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Wed, 11 Dec 2019 20:18:55 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@677 a8b55f48-bf90-11e4-a774-851b48703e85 --- qglengine/qglview.cpp | 6 +- qglengine/qglview.h | 18 +- qglengine/qglview_test/qglview_window.cpp | 35 - qglengine/qglview_test/qglview_window.h | 9 +- qglengine/qglview_test/qglview_window.ui | 779 +++++++++++++--------- qglengine/renderer.cpp | 21 +- qglengine/renderer.h | 10 +- qglengine/shaders/ds_final.glsl | 2 +- qglengine/shaders/ds_light.glsl | 15 +- qglengine/shaders/ds_tonemap.glsl | 3 +- 10 files changed, 515 insertions(+), 383 deletions(-) diff --git a/qglengine/qglview.cpp b/qglengine/qglview.cpp index 9a5bca7..e000119 100644 --- a/qglengine/qglview.cpp +++ b/qglengine/qglview.cpp @@ -44,8 +44,10 @@ QGLView::QGLView(): OpenGLWindow(), renderer_(this), mouse(this) { shaders_supported = false; fps_cnt = 0; fps_tm = fps_ = 0.; - fogDensity_ = fogEnd_ = 1.; - fogStart_ = 0.; + fogColor_ = Qt::darkGray; + fogDensity_ = 0.; + fogDecay_1 = 0.1; + fogDecay_0 = fogDecay_2 = 0.; hoverHaloFill_ = selectionHaloFill_ = 0.15f; //lmode = Simple; setFeature(qglFXAA, false); diff --git a/qglengine/qglview.h b/qglengine/qglview.h index 9db9a25..9b257fa 100644 --- a/qglengine/qglview.h +++ b/qglengine/qglview.h @@ -55,8 +55,9 @@ 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 fogStart READ fogStart WRITE setFogStart) - Q_PROPERTY (float fogEnd READ fogEnd WRITE setFogEnd) + 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 (int renderMode READ renderMode WRITE setRenderMode) Q_PROPERTY (bool grabMouse READ isGrabMouseEnabled WRITE setGrabMouseEnabled) Q_PROPERTY (bool mouseRotate READ isMouseRotateEnabled WRITE setMouseRotateEnabled) @@ -119,8 +120,9 @@ public: QColor ambientColor() const {return ambientColor_;} QColor fogColor() const {return fogColor_;} float fogDensity() const {return fogDensity_;} - float fogStart() const {return fogStart_;} - float fogEnd() const {return fogEnd_;} + float fogDecayConst() const {return fogDecay_0;} + float fogDecayLinear() const {return fogDecay_1;} + float fogDecayQuadratic() const {return fogDecay_2;} bool isFogEnabled() const {return fogEnabled_;} bool isLightEnabled() const {return lightEnabled_;} bool isGrabMouseEnabled() const {return mouse.isGrabMouseEnabled();} @@ -222,7 +224,8 @@ private: QHash features_; QSize prev_size; float lineWidth_; - float fogDensity_, fogStart_, fogEnd_, fps_, fps_tm, hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor; + float fogDensity_, fps_, fps_tm, fogDecay_0, fogDecay_1, fogDecay_2; + float hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor; int timer, fps_cnt, sh_id_loc, deleting_; bool is_first_draw, is_init, fogEnabled_, lightEnabled_; bool shaders_supported, changed_, need_init_; @@ -241,8 +244,9 @@ public slots: void setAmbientColor(const QColor & arg) {ambientColor_ = arg;} void setFogColor(const QColor & arg) {fogColor_ = arg;} void setFogDensity(const float & arg) {fogDensity_ = arg;} - void setFogStart(const float & arg) {fogStart_ = arg;} - void setFogEnd(const float & arg) {fogEnd_ = 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 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.cpp b/qglengine/qglview_test/qglview_window.cpp index 8ce0b1d..869c54f 100644 --- a/qglengine/qglview_test/qglview_window.cpp +++ b/qglengine/qglview_test/qglview_window.cpp @@ -152,23 +152,6 @@ void QGLViewWindow::loadFile(const QString & path, bool import) { } -void QGLViewWindow::selectionChanged() { - ObjectBase * sel_obj = view->view()->selectedObject(); - labelName->setText(sel_obj ? sel_obj->name() : ""); - /**if (cur == 0) box->hide(); - else { - box->setScale(cur->boundingBox().size()); - box->setPos(cur->boundingBox().pos()); - Box3D b = cur->boundingBox().movedTo(-cur->boundingBox().center()); - b.z = -b.z - b.height; - ps->setEmitterRect(b); - cur->addChild(box); - box->show(); - }*/ - //qDebug() << sel_obj->boundingBox(); -} - - void QGLViewWindow::on_actionReset_triggered() { ///view->view()->removeObject(axis, false); view->view()->scene()->destroy(); @@ -242,24 +225,6 @@ void QGLViewWindow::view_keyEvent(Qt::Key k, Qt::KeyboardModifiers m) { default: break; } } -\ - -void QGLViewWindow::on_pushButton_clicked() { - //view->view()->removeLight(view->view()->lightsCount() - 1); - //setWindowTitle(QString::number(view->view()->lightsCount())); - //QVector3D wp = view->view()->light(0)->worldPos(); - //view->view()->camera()->setPos(wp); - //view->view()->camera()->setAim(wp + (view->view()->light(0)->worldTransform() * QVector4D(view->view()->light(0)->direction)).toVector3D()*100); -} - - -void QGLViewWindow::on_pushButton_3_clicked() { - /*ObjectBaseList ol = view->view()->objects(true); - qDebug() << ol.size(); - foreach (ObjectBase * i, ol) { - //i->VBO().rebuffer(); - }*/ -} void QGLViewWindow::on_actionAdd_plane_triggered() { diff --git a/qglengine/qglview_test/qglview_window.h b/qglengine/qglview_test/qglview_window.h index 8017fe8..94d8fa7 100644 --- a/qglengine/qglview_test/qglview_window.h +++ b/qglengine/qglview_test/qglview_window.h @@ -109,12 +109,9 @@ private slots: void on_actionSaveSelected_triggered(); void on_actionOpen_triggered(); - void selectionChanged(); void view_keyEvent(Qt::Key k, Qt::KeyboardModifiers m); - void on_pushButton_clicked(); void on_pushButton_2_clicked() {view->view()->reloadShaders();} - void on_pushButton_3_clicked(); void on_actionAdd_plane_triggered(); void on_actionAdd_cube_triggered(); @@ -125,6 +122,12 @@ 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);} + public slots: signals: diff --git a/qglengine/qglview_test/qglview_window.ui b/qglengine/qglview_test/qglview_window.ui index 36c9e4a..a69791d 100644 --- a/qglengine/qglview_test/qglview_window.ui +++ b/qglengine/qglview_test/qglview_window.ui @@ -6,8 +6,8 @@ 0 0 - 1125 - 1032 + 1107 + 878 @@ -37,23 +37,6 @@ 0 - - - - - 10 - 75 - true - - - - - - - Qt::AlignCenter - - - @@ -73,285 +56,219 @@ Common - - - QFormLayout::AllNonFixedFieldsGrow - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - FOV - - - - - - - 0.100000000000000 - - - 179.900000000000006 - - - 60.000000000000000 - - - - - - - Depth - - - - - - - 3 - - - 999999999.000000000000000 - - - QAbstractSpinBox::AdaptiveDecimalStepType - - - 1.000000000000000 - - - - - - - Draw mode - - - - - - - 2 - - - - Point + + + + + + QFormLayout::AllNonFixedFieldsGrow - - - - Wireframe + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - Solid + + 0 + + + 0 + + + 0 + + + 0 - - - - - - - Back color - - - - - - - - 10 - 10 - 10 - - - - - - - - Ambient - - - - - - - - 10 - 10 - 10 - - - - - - - - Gamma - - - - - - - 0.010000000000000 - - - 5.000000000000000 - - - 1.000000000000000 - - - 2 - - - - - - - Hover halo - - - true - - - - - - - 255 - 0 - 251 - - - - true - - - - - - - Fill - - - - - - - 0.000000000000000 - - - 1.000000000000000 - - - 0.300000000000000 - - - 2 - - - 0.050000000000000 - - - 0.100000000000000 - - - - - - - - - - Selection halo - - - true - - - - - - - 0 - 143 - 239 - - - - true - - - - - - - Fill - - - - - - - 0.000000000000000 - - - 1.000000000000000 - - - 0.300000000000000 - - - 2 - - - 0.050000000000000 - - - 0.100000000000000 - - - - - - - - - - Camera - - - + - Orbit - - - true + FOV - - - Camera Light + + + 0.100000000000000 - - true + + 179.900000000000006 + + + 60.000000000000000 + + + + + + + Depth start + + + + + + + 3 + + + 999999999.000000000000000 + + + QAbstractSpinBox::AdaptiveDecimalStepType + + + 1.000000000000000 + + + + + + + Draw mode + + + + + + + 2 + + + + Point + + + + + Wireframe + + + + + Solid + + + + + + + + Back color + + + + + + + + 10 + 10 + 10 + + + + + + + + Ambient + + + + + + + + 10 + 10 + 10 + + + + + + + + Gamma + + + + + + + 0.010000000000000 + + + 5.000000000000000 + + + 1.000000000000000 + + + 2 - + + + + + Hover halo + + + true + + + + + + + 255 + 0 + 251 + + + + true + + + + + + + Fill + + + + + + + 0.000000000000000 + + + 1.000000000000000 + + + 0.300000000000000 + + + 2 + + + 0.050000000000000 + + + 0.100000000000000 + + + + + + @@ -359,6 +276,16 @@ + + + + Service mode + + + true + + + @@ -369,14 +296,258 @@ - - - - Service mode + + + + Selection halo - + true + + + + + + 0 + 143 + 239 + + + + true + + + + + + + Fill + + + + + + + 0.000000000000000 + + + 1.000000000000000 + + + 0.300000000000000 + + + 2 + + + 0.050000000000000 + + + 0.100000000000000 + + + + + + + + + + Camera + + + + + + Orbit + + + true + + + + + + + Camera Light + + + true + + + + + + + + + + + + + + + 0 + 0 + + + + Fog + + + + + + + + Density: + + + + + + + 0.000000000000000 + + + 10.000000000000000 + + + 0.000000000000000 + + + 3 + + + 0.050000000000000 + + + 0.100000000000000 + + + + + + + + 128 + 128 + 128 + + + + + + + + + + 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 + + + + + + @@ -401,7 +572,7 @@ 0 0 - 951 + 934 737 @@ -949,13 +1120,6 @@ - - - - remove light - - - @@ -963,27 +1127,6 @@ - - - - rebuff all - - - - - - - - 10 - 10 - 10 - - - - false - - - @@ -1040,8 +1183,8 @@ 0 0 - 990 - 853 + 973 + 719 @@ -1123,7 +1266,7 @@ 0 0 - 1125 + 1107 24 diff --git a/qglengine/renderer.cpp b/qglengine/renderer.cpp index 759cc63..bb93aed 100644 --- a/qglengine/renderer.cpp +++ b/qglengine/renderer.cpp @@ -157,10 +157,11 @@ void Renderer::initShaders() { prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i); } if (bindShader(srFinalPass, &prog)) { - prog->setUniformValue("tex_s_0", 0); - prog->setUniformValue("tex_s_1", 1); - prog->setUniformValue("tex_t_0", 2); - prog->setUniformValue("tex_t_1", 3); + prog->setUniformValue("tex_g1" , 0); + prog->setUniformValue("tex_s_0", 1); + prog->setUniformValue("tex_s_1", 2); + prog->setUniformValue("tex_t_0", 3); + prog->setUniformValue("tex_t_1", 4); } if (bindShader(srGeometryPass, &prog)) { setUniformMaps(prog); @@ -240,6 +241,9 @@ void Renderer::renderLight(int first_wr_buff) { setUniformViewCorners(prog, cam); 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_density", view->fogDensity_); fbo_out.setWriteBuffer(first_wr_buff + pass.second); glClearFramebuffer(Qt::black, false); renderQuad(prog, quad, cam); @@ -319,10 +323,11 @@ void Renderer::renderScene() { /// blending layers if (bindShader(srFinalPass, &prog)) { - fbo_out.bindColorTexture(obrSolidOmni , 0); - fbo_out.bindColorTexture(obrSolidSpot , 1); - fbo_out.bindColorTexture(obrTransparentOmni, 2); - fbo_out.bindColorTexture(obrTransparentSpot, 3); + //fbo_ds .bindColorTexture(dbrNormalZ , 0); + fbo_out.bindColorTexture(obrSolidOmni , 1); + fbo_out.bindColorTexture(obrSolidSpot , 2); + fbo_out.bindColorTexture(obrTransparentOmni, 3); + fbo_out.bindColorTexture(obrTransparentSpot, 4); fbo_out.setWriteBuffer(obrSum); renderQuad(prog, quad); } diff --git a/qglengine/renderer.h b/qglengine/renderer.h index 2071625..150f012 100644 --- a/qglengine/renderer.h +++ b/qglengine/renderer.h @@ -54,11 +54,11 @@ class Renderer: public RendererBase { srTonemapPass, }; enum DeferredBufferRole { - dbrDiffuseRough, - dbrNormalReflect, - dbrSpecularHeight, - dbrEmissionBitangX, - dbrSpeedBitangXY, + dbrDiffuse, + dbrNormalZ, + dbrSpecularReflect, + dbrEmissionRough, + //dbrSpeedBitangXY, }; enum OutBufferRole { obrTonemap, diff --git a/qglengine/shaders/ds_final.glsl b/qglengine/shaders/ds_final.glsl index 4786167..73aecb6 100644 --- a/qglengine/shaders/ds_final.glsl +++ b/qglengine/shaders/ds_final.glsl @@ -7,7 +7,7 @@ void main(void) { // frag // -uniform sampler2D tex_s_0, tex_s_1, tex_t_0, tex_t_1; +uniform sampler2D tex_g1, tex_s_0, tex_s_1, tex_t_0, tex_t_1; void main(void) { ivec2 tc = ivec2(gl_FragCoord.xy); diff --git a/qglengine/shaders/ds_light.glsl b/qglengine/shaders/ds_light.glsl index 454eda1..a6d0a42 100644 --- a/qglengine/shaders/ds_light.glsl +++ b/qglengine/shaders/ds_light.glsl @@ -19,6 +19,10 @@ uniform float z_near; 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; + const vec3 luma = vec3(0.299, 0.587, 0.114); const float _pe = 2.4e-7; @@ -93,7 +97,7 @@ void main(void) { vec4 v1 = texelFetch(tex_1, tc, 0); float z = v1.w; if (z == 1.) { - qgl_FragColor = vec4(0); + qgl_FragColor = vec4(fog_color.rgb, 0); return; } vec4 v0 = texelFetch(tex_0, tc, 0), @@ -124,7 +128,12 @@ void main(void) { si = vec3(0.); for (int i = 0; i < lights_count; ++i) calcLight(lights_start + i, normal, v); + vec3 res_col = max(vec3(0), li * diffuse + si * specular + emission); - qgl_FragColor = vec4(max(vec3(0), li * diffuse + si * specular + emission), alpha); - //qgl_FragColor. = vec3(alpha); + float plen = length(pos.xyz); + float fog = clamp(dot(fog_decay, vec3(1, plen, plen*plen)) * 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); } diff --git a/qglengine/shaders/ds_tonemap.glsl b/qglengine/shaders/ds_tonemap.glsl index 3655d93..b9b1f8a 100644 --- a/qglengine/shaders/ds_tonemap.glsl +++ b/qglengine/shaders/ds_tonemap.glsl @@ -20,5 +20,6 @@ void main(void) { float g = gamma / frame_max; res /= l; l = 1 - exp(-l*g); - qgl_FragColor.rgb = res * l; + res *= l; + qgl_FragColor = vec4(res, dot(res, luma)); }