diff --git a/qglview/data/room.dae.qgl b/qglview/data/room.dae.qgl new file mode 100644 index 0000000..364dd77 Binary files /dev/null and b/qglview/data/room.dae.qgl differ diff --git a/qglview/mainwindow.cpp b/qglview/mainwindow.cpp index 93debad..84afdba 100644 --- a/qglview/mainwindow.cpp +++ b/qglview/mainwindow.cpp @@ -69,15 +69,15 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow() groupMotionBlur->setChecked(view->isFeatureEnabled(QGLView::qglMotionBlurEnabled)); groupReflections->setChecked(view->isFeatureEnabled(QGLView::qglDynamicReflectionsEnabled)); checkSoftShadows->setChecked(view->isFeatureEnabled(QGLView::qglShadowsSoftEnabled)); - spinAccom->setValue(view->isFeatureEnabled(QGLView::qglEyeAccomodationTime)); - spinAccomMS->setValue(view->isFeatureEnabled(QGLView::qglEyeAccomodationMaxSpeed)); - spinCubemapSize->setValue(view->isFeatureEnabled(QGLView::qglDynamicReflectionsMapSize)); - spinShadowmapSize->setValue(view->isFeatureEnabled(QGLView::qglShadowsMapSize)); - spinMotionBlurFactor->setValue(view->isFeatureEnabled(QGLView::qglMotionBlurFactor)); - spinMotionBlurSteps->setValue(view->isFeatureEnabled(QGLView::qglMotionBlurSteps)); - spinBloomFactor->setValue(view->isFeatureEnabled(QGLView::qglBloomFactor)); - spinBloomRadius->setValue(view->isFeatureEnabled(QGLView::qglBloomRadius)); - spinBloomThreshold->setValue(view->isFeatureEnabled(QGLView::qglBloomThreshold)); + spinAccom->setValue(view->feature(QGLView::qglEyeAccomodationTime).toDouble()); + spinAccomMS->setValue(view->feature(QGLView::qglEyeAccomodationMaxSpeed).toDouble()); + spinCubemapSize->setValue(view->feature(QGLView::qglDynamicReflectionsMapSize).toInt()); + spinShadowmapSize->setValue(view->feature(QGLView::qglShadowsMapSize).toInt()); + spinMotionBlurFactor->setValue(view->feature(QGLView::qglMotionBlurFactor).toDouble()); + spinMotionBlurSteps->setValue(view->feature(QGLView::qglMotionBlurSteps).toInt()); + spinBloomFactor->setValue(view->feature(QGLView::qglBloomFactor).toDouble()); + spinBloomRadius->setValue(view->feature(QGLView::qglBloomRadius).toInt()); + spinBloomThreshold->setValue(view->feature(QGLView::qglBloomThreshold).toDouble()); axis = new GLObjectBase(); GLObjectBase * obj; @@ -93,9 +93,9 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow() axis->addChild(obj); view->addObject(axis); - cam_light = new Light(view->camera().pos()); + cam_light = new Light(); cam_light->intensity = 0.5; - cam_light->setName("camera"); + cam_light->setName("Camera_Light"); view->camera().addChild(cam_light); view->start(-1); startTimer(1000/60); @@ -121,7 +121,7 @@ void MainWindow::changeEvent(QEvent * e) { void MainWindow::timerEvent(QTimerEvent * ) { //static double t = 0.; - cam_light->setVisible(checkCameraLight->isChecked()); + cam_light->intensity = checkCameraLight->isChecked() ? 0.5 : 0.; //((RendererSimple*)(view->renderer()))->mpos = view->mapFromGlobal(QCursor::pos()); statusBar()->showMessage(QString("FPS: %1").arg(QString::number(view->currentFPS(), 'f', 2))); } diff --git a/qglview/mainwindow.ui b/qglview/mainwindow.ui index 25ec30e..ceac21f 100644 --- a/qglview/mainwindow.ui +++ b/qglview/mainwindow.ui @@ -22,7 +22,7 @@ 2 - 0 + 0 @@ -490,7 +490,7 @@ 1.000000000000000 - 128.000000000000000 + 2048.000000000000000 8.000000000000000 diff --git a/qglview/qglview.cpp b/qglview/qglview.cpp index cd585b1..3990fc9 100644 --- a/qglview/qglview.cpp +++ b/qglview/qglview.cpp @@ -83,6 +83,8 @@ QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) { sel_brush = QBrush(QColor(170, 100, 255, 120)); camera().setAim(QVector3D(0,0,5.5)); camera().setPos(QVector3D(10, 5, 5.5)); + camera().setName("Camera"); + addObject(camera()); emit cameraPosChanged(camera().pos()); //camera().aim_ = camera().pos_; ktm_.restart(); @@ -150,21 +152,11 @@ void QGLView::initializeGL() { currentQGLView = (QGLWidget * )viewport(); currentGLTextureManager = &textures_manager; currentCamera = &camera(); - //glEnable(GL_POLYGON_SMOOTH); glEnable(GL_TEXTURE_MAX_ANISOTROPY_EXT); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - //glEnable(GL_TEXTURE_2D); - //glEnable(GL_TEXTURE_CUBE_MAP); glEnableDepth(); glEnable(GL_CULL_FACE); - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1); - glActiveTextureChannel(3); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); @@ -176,13 +168,8 @@ void QGLView::initializeGL() { glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glActiveTextureChannel(0); - //glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NONE); - //glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NONE); - - //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glShadeModel(GL_SMOOTH); glCullFace(GL_BACK); - glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT, GL_DIFFUSE); @@ -277,9 +264,9 @@ void QGLView::paintGL() { } fbo_selection.release(); glEnableDepth(); - glEnableClientState(GL_NORMAL_ARRAY); + /*glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); + glEnableClientState(GL_COLOR_ARRAY);*/ } camera().apply(aspect); diff --git a/qglview/qglview.h b/qglview/qglview.h index e538d46..d3b3297 100644 --- a/qglview/qglview.h +++ b/qglview/qglview.h @@ -157,7 +157,7 @@ public: int objectsCount(bool all = false) {if (!all) return objects_.childCount(); int cnt = 0; objectsCountInternal(&cnt, &objects_); return cnt;} void removeObject(GLObjectBase * o, bool inChildren = true) {if (inChildren) removeObjectInternal(o, &objects_); else objects_.removeChild(o);} void removeObject(GLObjectBase & o, bool inChildren = true) {removeObject(&o, inChildren);} - void clearObjects(bool deleteAll = false) {objects_.clearChildren(deleteAll); sel_obj = hov_obj = 0;} + void clearObjects(bool deleteAll = false) {objects_.clearChildren(deleteAll); addObject(camera()); sel_obj = hov_obj = 0;} QList objects(bool all = false) {return objects_.children(all);} int lightsCount() const {return lights_.size();} diff --git a/qglview/renderer_deferred_shading.cpp b/qglview/renderer_deferred_shading.cpp index f88ef27..0276708 100644 --- a/qglview/renderer_deferred_shading.cpp +++ b/qglview/renderer_deferred_shading.cpp @@ -31,7 +31,8 @@ fbo_g(5, true, GL_RGBA16F), fbo_out(3, false, GL_RGB16F), fbo_hsmall(1, false, G << ShaderPair("bloom_pass_1", &shader_bloom_1) << ShaderPair("fbo_add", &shader_fbo_add) << ShaderPair("motion_blur", &shader_motion_blur) - << ShaderPair("shadow", &shader_shadow); + << ShaderPair("shadow", &shader_shadow) + << ShaderPair("ssr", &shader_ssr); for (int i = 0; i < shaders.size(); ++i) *(shaders[i].second) = 0; lights_per_pass = 8; @@ -194,6 +195,27 @@ void RendererDeferredShading::renderScene() { glActiveTextureChannel(0); glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri)); + if (view.isFeatureEnabled(QGLView::qglDynamicReflectionsEnabled)) { + fbo_out.setWriteBuffer(wi); + glActiveTextureChannel(1); + glBindTexture(GL_TEXTURE_2D, fbo_g.colorTexture(0)); + glActiveTextureChannel(2); + glBindTexture(GL_TEXTURE_2D, fbo_g.colorTexture(1)); + shader_ssr->bind(); + shader_ssr->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4()); + shader_ssr->setUniformValue("dt", QVector2D(1. / fbo_out.width(), 1. / fbo_out.height())); + shader_ssr->setUniformValue("t0", 1); + shader_ssr->setUniformValue("t1", 2); + shader_ssr->setUniformValue("ts", 0); + //shader_ssr->setUniformValue("ts", 1); + shader_ssr->setUniformValue("factor", GLfloat(view.feature(QGLView::qglMotionBlurFactor).toDouble())); + shader_ssr->setUniformValue("steps", view.feature(QGLView::qglMotionBlurSteps).toInt()); + glDrawQuad(shader_ssr); + glActiveTextureChannel(0); + glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(wi)); + piSwap(wi, ri); + } + if (view.isFeatureEnabled(QGLView::qglEyeAccomodationEnabled)) { fbo_hsmall.bind(); fbo_hsmall.setWriteBuffer(0); @@ -256,7 +278,8 @@ void RendererDeferredShading::renderScene() { fbo_out.setWriteBuffer(2); fbo_out.setReadBuffer(ri); glBlitFramebuffer(0, 0, fbo_out.width(), fbo_out.height(), 0, 0, fbo_out.width(), fbo_out.height(), GL_COLOR_BUFFER_BIT, GL_NEAREST); - + QTime tm; + tm.restart(); fbo_out.setWriteBuffer(wi); shader_bloom_0->bind(); shader_bloom_0->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4()); @@ -284,7 +307,7 @@ void RendererDeferredShading::renderScene() { piSwap(wi, ri); crad *= 2; } - + qDebug() << tm.elapsed(); fbo_out.setWriteBuffer(wi); glActiveTextureChannel(0); glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri)); @@ -345,11 +368,6 @@ void RendererDeferredShading::reloadShaders() { void RendererDeferredShading::setupShadersTextures(GLObjectBase & object, GLRendererBase::RenderingParameters & rp) { - shader_ds_0->setUniformValue("has_diffuse", object.material().map_diffuse.bitmap_id != 0); - shader_ds_0->setUniformValue("has_bump", object.material().map_normal.bitmap_id != 0); - shader_ds_0->setUniformValue("has_height", object.material().map_relief.bitmap_id != 0); - shader_ds_0->setUniformValue("bump_scale", object.material().map_normal.color_amount); - shader_ds_0->setUniformValue("height_scale", object.material().map_relief.color_amount); glActiveTextureChannel(6); glBindTexture(GL_TEXTURE_2D, white_image_id); glActiveTextureChannel(7); diff --git a/qglview/renderer_deferred_shading.h b/qglview/renderer_deferred_shading.h index 7525811..55a1210 100644 --- a/qglview/renderer_deferred_shading.h +++ b/qglview/renderer_deferred_shading.h @@ -47,7 +47,7 @@ private: GLFramebuffer fbo_g, fbo_out, fbo_hsmall; QGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small; QGLShaderProgram * shader_bloom_0, * shader_bloom_1, * shader_motion_blur, * shader_fbo_add; - QGLShaderProgram * shader_shadow; + QGLShaderProgram * shader_shadow, * shader_ssr; QVector shaders; QMatrix4x4 prev_view, prev_proj; diff --git a/qglview/shaders/dsl_pass_0.frag b/qglview/shaders/dsl_pass_0.frag index d9a5701..0c684d9 100644 --- a/qglview/shaders/dsl_pass_0.frag +++ b/qglview/shaders/dsl_pass_0.frag @@ -50,8 +50,8 @@ void main(void) { vec3 speed = pos.xyz/pos.w - ppos.xyz/ppos.w; //speed /= abs(pos.z); - gl_FragDepth = logz; - qgl_FragData[0] = vec4(dc.rgb, pos.z); + //gl_FragDepth = logz; + qgl_FragData[0] = vec4(dc.rgb, pos.w); qgl_FragData[1] = vec4(n.xyz / 2. + vec3(0.5), specularity); qgl_FragData[2] = vec4(spec.rgb, hei); qgl_FragData[3] = vec4(self.rgb, bn.x); diff --git a/qglview/shaders/dsl_pass_1.frag b/qglview/shaders/dsl_pass_1.frag index d232fc6..f800c69 100644 --- a/qglview/shaders/dsl_pass_1.frag +++ b/qglview/shaders/dsl_pass_1.frag @@ -134,7 +134,7 @@ 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(vds2.x*1); + //qgl_FragData[0].rgb = vec3(abs((v0.w)/50)); //qgl_FragData[0].rgb = li + vec3(texelFetch(t_pp, tc, 0).xyz); //shd = shd - shp.w; diff --git a/qglview/shaders/ssr.frag b/qglview/shaders/ssr.frag new file mode 100644 index 0000000..b14003e --- /dev/null +++ b/qglview/shaders/ssr.frag @@ -0,0 +1,17 @@ +#version 150 + +uniform sampler2D t0, t1, ts; +uniform float z_near, z_far; + +void main(void) { + ivec2 tc = ivec2(gl_FragCoord.xy); + vec2 sp = qgl_FragTexture.xy; + vec4 v0 = texelFetch(t0, tc, 0), v1 = texelFetch(t1, tc, 0), vs = texelFetch(ts, tc, 0); + vec3 dc = v0.rgb, n = v1.xyz * 2. - vec3(1.); + vec3 vd = vec3(0, 0, 1); + vec3 rn = reflect(vd, n); + float coeff = clamp(dot(vd, rn), 0, 1); + vec3 rvs = texture(ts, sp - rn.xy/v0.w).rgb; + qgl_FragData[0].rgb = mix(vs.rgb, rvs, coeff); + //qgl_FragData[0].rgb = vec3(v0.w/10); +} diff --git a/qglview/shaders/ssr.vert b/qglview/shaders/ssr.vert new file mode 100644 index 0000000..6bc001e --- /dev/null +++ b/qglview/shaders/ssr.vert @@ -0,0 +1,6 @@ +#version 150 + +void main(void) { + qgl_FragTexture = qgl_Texture; + gl_Position = qgl_ftransform(); +}