From 822e1518ce1619a89064b68d8543a08050711ef5 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: Fri, 4 Dec 2015 13:59:10 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@60 a8b55f48-bf90-11e4-a774-851b48703e85 --- qglview/glcamera.cpp | 18 ++++++++++++++++-- qglview/glcamera.h | 4 +++- qglview/globject.cpp | 14 ++++---------- qglview/globject.h | 4 +--- qglview/glrendererbase.cpp | 10 ++++++---- qglview/glrendererbase.h | 1 + qglview/glshaders.cpp | 1 + qglview/mainwindow.cpp | 9 +++++---- qglview/mainwindow.ui | 9 ++++----- qglview/qglview.cpp | 10 ++++++---- qglview/renderer_deferred_shading.cpp | 16 ++++++++++++---- qglview/renderer_simple.cpp | 1 + qglview/shaders/dsl_pass_1.frag | 10 +++------- qglview/shaders/hdr.frag | 12 ++++++------ qglview/shaders/shadow.frag | 2 +- 15 files changed, 70 insertions(+), 51 deletions(-) diff --git a/qglview/glcamera.cpp b/qglview/glcamera.cpp index 09c8ea2..284c330 100644 --- a/qglview/glcamera.cpp +++ b/qglview/glcamera.cpp @@ -59,13 +59,27 @@ void Camera::apply(const GLdouble & aspect) { pm.rotate(angles_.z(), 0., 0., 1.); //pm.translate(-aim_); if (parent_) { - pm.translate(-aim_); - pm *= parent_->worldTransform().inverted(); + //double dist = pm(2, 3); + QMatrix4x4 pmat = parent_->worldTransform();//.inverted(); + //offset_.setZ(offset_.z() - dist); + offset_ = pmat.column(3).toVector3D(); + pmat(0, 3) = pmat(1, 3) = pmat(2, 3) = 0.; + pmat.translate(aim_); + //pm.translate(-aim_); + pm *= pmat.inverted(); + //qDebug() << pmat; } setGLMatrix(pm); //qDebug() << angles_; } + +QMatrix4x4 Camera::offsetMatrix() const { + QMatrix4x4 ret; + ret.translate(parent_ ? -offset_ : -aim_); + return ret; +} + /* void Camera::localTransform(QMatrix4x4 & m) { return; diff --git a/qglview/glcamera.h b/qglview/glcamera.h index 6fe3ea3..b1a8d09 100644 --- a/qglview/glcamera.h +++ b/qglview/glcamera.h @@ -89,10 +89,12 @@ public: void assign(const Camera & c); //QVector3D pointFromViewport(int x_, int y_, double z_); TODO + QMatrix4x4 offsetMatrix() const; + private: //void localTransform(QMatrix4x4 & m); - QVector3D aim_; + QVector3D aim_, offset_; GLdouble fov_; GLdouble depth_start; GLdouble depth_end; diff --git a/qglview/globject.cpp b/qglview/globject.cpp index 06ea04b..d30c951 100644 --- a/qglview/globject.cpp +++ b/qglview/globject.cpp @@ -150,7 +150,7 @@ void GLObjectBase::buildTransform() { if (p != 0) itransform_ = p->itransform_; if (raw_matrix) { - itransform_.translate(is_root ? dcam_pos_ : pos_); + itransform_.translate(pos_); itransform_ *= mat_; //qDebug() << "raw_matrix" << itransform_; } else @@ -162,7 +162,7 @@ void GLObjectBase::buildTransform() { void GLObjectBase::localTransform(QMatrix4x4 & m) { - m.translate(is_root ? dcam_pos_ : pos_); + m.translate(pos_); m.rotate(angles_.z(), 0., 0., 1.); m.rotate(angles_.y(), 0., 1., 0.); m.rotate(angles_.x(), 1., 0., 0.); @@ -176,12 +176,6 @@ void GLObjectBase::checkPass() { } -void GLObjectBase::preparePos(const Camera & cam) { - dcam_pos_ = pos_ - cam.aim(); - buildTransform(); -} - - QMatrix4x4 GLObjectBase::worldMatrix(QMatrix4x4 parent) const { QMatrix4x4 mat; mat.translate(pos_); @@ -217,7 +211,7 @@ void GLObjectBase::render(int * id, QMap * ids, int sh_id_ -Light::Light(): GLObjectBase(), shadow_map(1, true, GL_R16F) { +Light::Light(): GLObjectBase(), shadow_map(0, true, GL_R16F) { type_ = GLObjectBase::Light; light_type = Omni; intensity = 1.; @@ -228,7 +222,7 @@ Light::Light(): GLObjectBase(), shadow_map(1, true, GL_R16F) { } -Light::Light(const QVector3D & p, const QColor & c, GLdouble i): GLObjectBase(), shadow_map(1, true, GL_R16F) { +Light::Light(const QVector3D & p, const QColor & c, GLdouble i): GLObjectBase(), shadow_map(0, true, GL_R16F) { type_ = GLObjectBase::Light; light_type = Omni; pos_ = p; diff --git a/qglview/globject.h b/qglview/globject.h index 9d5c31b..03175f9 100644 --- a/qglview/globject.h +++ b/qglview/globject.h @@ -168,8 +168,6 @@ public: const Box3D & boundingBox(bool withChildren = true) const {return bound;} GLVBO & VBO() {return vbo;} - void preparePos(const Camera & cam); - QVector3D pos_h; QVector points, puvws; QVector faces, uvws, norms; @@ -198,7 +196,7 @@ protected: RenderMode render_mode; Material material_; Box3D bound; - QVector3D pos_, angles_, scale_, dcam_pos_; + QVector3D pos_, angles_, scale_; QList children_; QList textures; QMatrix4x4 itransform_, mat_; diff --git a/qglview/glrendererbase.cpp b/qglview/glrendererbase.cpp index cbdf97c..f774ed7 100644 --- a/qglview/glrendererbase.cpp +++ b/qglview/glrendererbase.cpp @@ -164,6 +164,7 @@ void GLRendererBase::renderObjects(int pass, int light_pass, void * shaders, boo rpl.prev_view_matrix = rp.prev_view_matrix; rpl.proj_matrix = rp.proj_matrix; rpl.prev_proj_matrix = rp.prev_proj_matrix; + rpl.cam_offset_matrix = view.camera().offsetMatrix(); //qDebug() << "view:" << rp.view_matrix; for (int i = 0; i < 32; ++i) rpl.prev_tex[i] = 0; setupTextures(view.objects_, rpl, true); @@ -187,7 +188,7 @@ void GLRendererBase::renderSingleObject(GLObjectBase & o, RenderingParameters & if (!o.visible_) return; if (rpl.pass == o.pass_) { Material & mat(o.material_); - QMatrix4x4 curview = rpl.view_matrix * o.itransform_, prevview = rpl.prev_view_matrix * o.itransform_; + QMatrix4x4 curview = rpl.view_matrix * rpl.cam_offset_matrix * o.itransform_, prevview = rpl.prev_view_matrix * rpl.cam_offset_matrix * o.itransform_; setupTextures(o, rpl, false); mat.apply((QGLShaderProgram*)rpl.shaders); glSetPolygonMode(o.render_mode != GLObjectBase::View ? o.render_mode : (view.rmode != GLObjectBase::View ? view.rmode : GL_FILL)); @@ -251,10 +252,11 @@ void GLRendererBase::renderShadow(Light * l, QGLShaderProgram * prog, QMatrix4x4 rpl.textures = rpl.light = rpl.fog = false; rpl.view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX); rpl.proj_matrix = getGLMatrix(GL_PROJECTION_MATRIX); + rpl.cam_offset_matrix = cam.offsetMatrix(); QMatrix4x4 mbias; mbias.scale(0.5, 0.5, 0.5); mbias.translate(1., 1., 1.); - l->shadow_matrix = mbias*rpl.proj_matrix*rpl.view_matrix*mat;//;// * mbias; + l->shadow_matrix = mbias*rpl.proj_matrix*rpl.view_matrix*rpl.cam_offset_matrix*mat;//;// * mbias; //qDebug() << mbias; //glPushMatrix(); renderSingleShadow(view.objects_, rpl); @@ -268,10 +270,10 @@ void GLRendererBase::renderSingleShadow(GLObjectBase & o, RenderingParameters & if (!o.visible_) return; if (rpl.shaders) { //qDebug() << o.name() << curview << curview.determinant(); - setUniformMatrices((QGLShaderProgram*)rpl.shaders, rpl.proj_matrix, rpl.view_matrix * o.itransform_); + setUniformMatrices((QGLShaderProgram*)rpl.shaders, rpl.proj_matrix, rpl.view_matrix * rpl.cam_offset_matrix * o.itransform_); } else { glMatrixMode(GL_MODELVIEW); - setGLMatrix(rpl.view_matrix * o.itransform_); + setGLMatrix(rpl.view_matrix * rpl.cam_offset_matrix * o.itransform_); } glPolygonMode(GL_FRONT_AND_BACK, o.render_mode != GLObjectBase::View ? o.render_mode : (view.rmode != GLObjectBase::View ? view.rmode : GL_FILL)); glLineWidth(o.line_width > 0. ? o.line_width : view.lineWidth_); diff --git a/qglview/glrendererbase.h b/qglview/glrendererbase.h index 203bbb5..0445cc1 100644 --- a/qglview/glrendererbase.h +++ b/qglview/glrendererbase.h @@ -48,6 +48,7 @@ protected: QMatrix4x4 proj_matrix, proj_matrix_i, prev_proj_matrix; QMatrix4x4 viewproj_matrix, viewproj_matrix_i; QMatrix3x3 normal_matrix; + QMatrix4x4 cam_offset_matrix; QGLShaderProgram * cur_shader; }; diff --git a/qglview/glshaders.cpp b/qglview/glshaders.cpp index 1d3785d..1cdf122 100644 --- a/qglview/glshaders.cpp +++ b/qglview/glshaders.cpp @@ -238,6 +238,7 @@ void setUniformLight(QGLShaderProgram * prog, Light * light, QString ulightn, co prog->setUniformValue((ulightn + ".shadow").toLatin1().constData(), shadow); prog->setUniformValue((ulightn + ".shadowColor").toLatin1().constData(), shadow); prog->setUniformValue((ulightn + ".shadowMatrix").toLatin1().constData(), light->shadow_matrix); + //qDebug() << light->shadow_matrix; //prog->setUniformValue((ulightn + ".shadowDir0").toLatin1().constData(), (mat * dir0)); //prog->setUniformValue((ulightn + ".shadowDir1").toLatin1().constData(), (mat * dir1)); //qDebug() << light->direction << light->dir0 << light->dir1; diff --git a/qglview/mainwindow.cpp b/qglview/mainwindow.cpp index 95ddb0b..2839c26 100644 --- a/qglview/mainwindow.cpp +++ b/qglview/mainwindow.cpp @@ -80,8 +80,12 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow() //((Light*)obj->child(i))->decay_linear = .5; } view->addObject(obj); + + obj->setPos(1000000, -1000000, -10000000); obj->child("Box001")->addChild(&(view->camera())); - //view->camera().flyToDistance(30); + view->camera().setPos(QVector3D(10, -20, 20)); + //view->camera().setAim(obj->pos()); + view->camera().flyToDistance(500); double al = 7.; obj = new GLPrimitiveLine(QVector3D(0, 0, -al), QVector3D(0, 0, al)); @@ -98,9 +102,6 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow() obj = new GLPrimitiveLine(QVector3D(), QVector3D(cos(lng)*cos(lat), sin(lng)*cos(lat), sin(lat)/*(EARTH_H/EARTH_WL)*/)*5); view->addObject(obj); - view->camera().setPos(QVector3D(10, -20, 20)); - view->camera().setAim(QVector3D()); - view->camera().flyToDistance(500); //view->camera().setMode(Camera::AimMatrix); Light * l = new Light(view->camera().pos()); /*l->light_type = Light::Cone; diff --git a/qglview/mainwindow.ui b/qglview/mainwindow.ui index d462580..b234152 100644 --- a/qglview/mainwindow.ui +++ b/qglview/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 1131 - 772 + 781 @@ -513,6 +513,9 @@ soft shadows + + true + @@ -530,9 +533,6 @@ accomodation - - true - @@ -680,7 +680,6 @@ 0 - tabWidget diff --git a/qglview/qglview.cpp b/qglview/qglview.cpp index d01526b..2c2a47b 100644 --- a/qglview/qglview.cpp +++ b/qglview/qglview.cpp @@ -72,7 +72,7 @@ QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) { setFeature(qglMotionBlurSteps, 8); setFeature(qglShadowsEnabled, false); setFeature(qglShadowsMapSize, 512); - setFeature(qglShadowsSoftEnabled, false); + setFeature(qglShadowsSoftEnabled, true); setFeature(qglDynamicReflectionsEnabled, false); setFeature(qglDynamicReflectionsMapSize, 512); mouse_first = mouseSelect_ = hoverHalo_ = selectionHalo_ = true; @@ -213,7 +213,8 @@ void QGLView::paintGL() { glEnable(GL_CULL_FACE); //glDisable(GL_CULL_FACE); camera().apply(aspect); - objects_.preparePos(camera()); + //objects_.preparePos(camera()); + start_rp.cam_offset_matrix = camera().offsetMatrix(); start_rp.proj_matrix = getGLMatrix(GL_PROJECTION_MATRIX); start_rp.view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX); //objects_.buildTransform(); @@ -276,7 +277,8 @@ void QGLView::paintGL() { } camera().apply(aspect); - objects_.preparePos(camera()); + start_rp.cam_offset_matrix = camera().offsetMatrix(); + //objects_.preparePos(camera()); static GLRendererBase * prev_rend = 0; if (prev_rend != renderer_) { @@ -422,7 +424,7 @@ void QGLView::renderSingleSelection(GLObjectBase & o) { o.loadTextures(); } if (!o.visible_ || !o.select_) return; - QMatrix4x4 curview = start_rp.view_matrix * o.itransform_; + QMatrix4x4 curview = start_rp.view_matrix * start_rp.cam_offset_matrix * o.itransform_; ids.insert(cid, &o); if (shaders_supported){ setUniformMatrices(shader_select, start_rp.proj_matrix, curview); diff --git a/qglview/renderer_deferred_shading.cpp b/qglview/renderer_deferred_shading.cpp index fe51334..f88ef27 100644 --- a/qglview/renderer_deferred_shading.cpp +++ b/qglview/renderer_deferred_shading.cpp @@ -66,6 +66,8 @@ void RendererDeferredShading::renderScene() { QMatrix4x4 mview = rp.view_matrix; QMatrix4x4 mviewi = rp.view_matrix_i; QMatrix4x4 mviewproji = (mview * mproj).inverted(); + QMatrix4x4 moffset = view.camera().offsetMatrix(); + QMatrix4x4 moffseti = moffset.inverted(); rp.prev_proj_matrix = prev_proj; rp.prev_view_matrix = prev_view; QMatrix4x4 vc_proji; @@ -133,7 +135,7 @@ void RendererDeferredShading::renderScene() { l->shadow_map.setWriteBuffer(0); glClearFramebuffer(); //glClear(GL_DEPTH_BUFFER_BIT); - renderShadow(l, shader_shadow, mviewi); + renderShadow(l, shader_shadow, moffseti*mviewi); l->shadow_map.release(); } } @@ -160,6 +162,7 @@ void RendererDeferredShading::renderScene() { shader_ds_1->setUniformValue("mat_view", mview); shader_ds_1->setUniformValue("mat_viewi", mviewi); shader_ds_1->setUniformValue("mat_viewproji", mviewproji); + shader_ds_1->setUniformValue("shadow_on", view.isFeatureEnabled(QGLView::qglShadowsEnabled) ? 1 : 0); shader_ds_1->setUniformValue("dt", QVector2D(1. / view.viewport()->width(), 1. / view.viewport()->height())); rp.setUniform(shader_ds_1); fbo_g.bindColorTextures(); @@ -181,7 +184,7 @@ void RendererDeferredShading::renderScene() { glActiveTextureChannel(6); glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri)); fbo_out.setWriteBuffer(wi); - setupDSLights(l, mview); + setupDSLights(l, mview * moffset); glDrawQuad(shader_ds_1, corner_dirs); //break; } @@ -369,8 +372,13 @@ void RendererDeferredShading::setupDSLights(int pass, const QMatrix4x4 & view_ma lv << view.lights()[i]; glActiveTextureChannel(shadow_start + i - light_start); glBindTexture(GL_TEXTURE_2D, lv.back()->shadow_map.depthTexture()); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + if (view.isFeatureEnabled(QGLView::qglShadowsSoftEnabled)) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); } amb_light.setName("null"); diff --git a/qglview/renderer_simple.cpp b/qglview/renderer_simple.cpp index 484dec9..3313e33 100644 --- a/qglview/renderer_simple.cpp +++ b/qglview/renderer_simple.cpp @@ -71,6 +71,7 @@ void RendererSimple::renderScene() { glDepthFunc(GL_EQUAL); } view.camera().apply(view.aspect); + rp.cam_offset_matrix = view.camera().offsetMatrix(); rp.prepare(); setupLights(l, 8); diff --git a/qglview/shaders/dsl_pass_1.frag b/qglview/shaders/dsl_pass_1.frag index 57bb556..c7a71ea 100644 --- a/qglview/shaders/dsl_pass_1.frag +++ b/qglview/shaders/dsl_pass_1.frag @@ -7,7 +7,7 @@ in vec4 view_pos; uniform vec3 ambient; uniform sampler2D t0, t1, t2, t3, t4, t_pp; uniform sampler2D td; -uniform int gid, lightsCount; +uniform int gid, lightsCount, shadow_on; uniform float z_near, z_far; uniform bool firstPass; uniform vec2 dt; @@ -23,11 +23,7 @@ vec3 vds, vds2; float sh_pow, sh_mul, dist, NdotL, NdotH, spot, ldist, diff, sdist, shadow; float getShadow(int light, vec3 view_pos, vec3 dpos) { - //shp = mat_viewi * vec4(view_pos, 1); - //shp += vec4(dpos, 0); - shp = qgl_Light[light].shadowMatrix * vec4(view_pos, 1); - //shp.xyz /= shp.w; shp.z -= 0.1; return textureProj(qgl_Light[light].shadow, shp); } @@ -74,7 +70,7 @@ void calcLight(in int index, in vec3 n, in vec3 v, in vec4 v2) { getShadow(index, pos.xyz, vds + vds2 + vds2) + getShadow(index, pos.xyz, - vds - vds2 - vds2) + getShadow(index, pos.xyz, - vds + vds2 + vds2)*/; - spot *= shadow;// / 29.; + spot *= mix(1., shadow, shadow_on);// / 29.; } spot /= (qgl_Light[index].constantAttenuation + ldist * (qgl_Light[index].linearAttenuation + ldist * qgl_Light[index].quadraticAttenuation)); ///li += spot * gl_LightSource[index].diffuse.rgb * light_diffuse(0, ldir, n); @@ -116,6 +112,7 @@ void main(void) { pos.xy *= v0.z; pos.z = posz;*/ + pos.w = 1; pos.xyz = view_dir * v0.w; pos.z = -pos.z; @@ -137,7 +134,6 @@ void main(void) { calcLight(0, n, v, v2); qgl_FragData[0].rgb = li * dc + si * v2.rgb + v3.rgb + texelFetch(t_pp, tc, 0).rgb; - qgl_FragData[0].rgb = vec3(abs(shp.xy/shp.w)/1,0); //qgl_FragData[0].rgb = li + vec3(texelFetch(t_pp, tc, 0).xyz); //shd = shd - shp.w; diff --git a/qglview/shaders/hdr.frag b/qglview/shaders/hdr.frag index 0400a7e..b3e50a3 100644 --- a/qglview/shaders/hdr.frag +++ b/qglview/shaders/hdr.frag @@ -16,14 +16,14 @@ vec3 Uncharted2Tonemap(vec3 x) { } void main(void) { - qgl_FragData[0].rgb = texelFetch(t0, ivec2(gl_FragCoord.xy), 0).rgb; - return; + //qgl_FragData[0].rgb = texelFetch(t0, ivec2(gl_FragCoord.xy), 0).rgb; + //return; vec3 inColor = texelFetch(t0, ivec2(gl_FragCoord.xy), 0).rgb; - inColor *= exposure; - float ExposureBias = 1; + inColor *= exposure / 1.45; + float ExposureBias = 1.; vec3 curr = Uncharted2Tonemap(ExposureBias*inColor); - vec3 whiteScale = 1 / Uncharted2Tonemap(vec3(tW)); + vec3 whiteScale = 1. / Uncharted2Tonemap(vec3(tW)); vec3 color = curr * whiteScale; - vec3 retColor = pow(color, vec3(1 / 1.2)); + vec3 retColor = color;//pow(color, vec3(1 / 1)); qgl_FragData[0].rgb = retColor; } diff --git a/qglview/shaders/shadow.frag b/qglview/shaders/shadow.frag index 25628db..145b87e 100644 --- a/qglview/shaders/shadow.frag +++ b/qglview/shaders/shadow.frag @@ -3,5 +3,5 @@ in float w; void main(void) { - qgl_FragData[0].r = w; + //;qgl_FragData[0].r = w; }