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();
+}