git-svn-id: svn://db.shs.com.ru/libs@67 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2015-12-09 20:57:38 +00:00
parent 0dcea8e214
commit 30ea938f38
11 changed files with 72 additions and 44 deletions

BIN
qglview/data/room.dae.qgl Normal file

Binary file not shown.

View File

@@ -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)));
}

View File

@@ -22,7 +22,7 @@
<number>2</number>
</property>
<property name="margin">
<number>0</number>
<number>0</number>
</property>
<item>
<widget class="QLabel" name="labelName">
@@ -490,7 +490,7 @@
<double>1.000000000000000</double>
</property>
<property name="maximum">
<double>128.000000000000000</double>
<double>2048.000000000000000</double>
</property>
<property name="value">
<double>8.000000000000000</double>

View File

@@ -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);

View File

@@ -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<GLObjectBase * > objects(bool all = false) {return objects_.children(all);}
int lightsCount() const {return lights_.size();}

View File

@@ -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<int>(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<int>(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);

View File

@@ -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<ShaderPair> shaders;
QMatrix4x4 prev_view, prev_proj;

View File

@@ -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);

View File

@@ -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;

17
qglview/shaders/ssr.frag Normal file
View File

@@ -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);
}

6
qglview/shaders/ssr.vert Normal file
View File

@@ -0,0 +1,6 @@
#version 150
void main(void) {
qgl_FragTexture = qgl_Texture;
gl_Position = qgl_ftransform();
}