git-svn-id: svn://db.shs.com.ru/libs@48 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
43032
qglview/data/test.DAE
43032
qglview/data/test.DAE
File diff suppressed because one or more lines are too long
@@ -161,7 +161,9 @@ void GLRendererBase::renderObjects(int pass, int light_pass, void * shaders, boo
|
||||
rpl.light = rpl.prev_light = light;
|
||||
rpl.fog = rpl.prev_fog = fog;
|
||||
rpl.view_matrix = rp.view_matrix;
|
||||
rpl.prev_view_matrix = rp.prev_view_matrix;
|
||||
rpl.proj_matrix = rp.proj_matrix;
|
||||
rpl.prev_proj_matrix = rp.prev_proj_matrix;
|
||||
//qDebug() << "view:" << rp.view_matrix;
|
||||
for (int i = 0; i < 32; ++i) rpl.prev_tex[i] = 0;
|
||||
setupTextures(view.objects_, rpl, true);
|
||||
@@ -185,7 +187,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_;
|
||||
QMatrix4x4 curview = rpl.view_matrix * o.itransform_, prevview = rpl.prev_view_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));
|
||||
@@ -215,7 +217,7 @@ void GLRendererBase::renderSingleObject(GLObjectBase & o, RenderingParameters &
|
||||
}
|
||||
if (rpl.shaders) {
|
||||
//qDebug() << o.name() << curview << curview.determinant();
|
||||
setUniformMatrices((QGLShaderProgram*)rpl.shaders, rpl.proj_matrix, curview);
|
||||
setUniformMatrices((QGLShaderProgram*)rpl.shaders, rpl.proj_matrix, curview, rpl.prev_proj_matrix, prevview);
|
||||
} else {
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
setGLMatrix(curview);
|
||||
|
||||
@@ -44,8 +44,8 @@ protected:
|
||||
bool prev_fog;
|
||||
GLuint prev_tex[32];
|
||||
void * shaders;
|
||||
QMatrix4x4 view_matrix, view_matrix_i;
|
||||
QMatrix4x4 proj_matrix, proj_matrix_i;
|
||||
QMatrix4x4 view_matrix, view_matrix_i, prev_view_matrix;
|
||||
QMatrix4x4 proj_matrix, proj_matrix_i, prev_proj_matrix;
|
||||
QMatrix4x4 viewproj_matrix, viewproj_matrix_i;
|
||||
QMatrix3x3 normal_matrix;
|
||||
QGLShaderProgram * cur_shader;
|
||||
|
||||
@@ -145,12 +145,14 @@ bool loadShaders(QGLShaderProgram * prog, const QString & name, const QString &
|
||||
}
|
||||
|
||||
|
||||
void setUniformMatrices(QGLShaderProgram * prog, QMatrix4x4 proj, QMatrix4x4 view) {
|
||||
void setUniformMatrices(QGLShaderProgram * prog, QMatrix4x4 proj, QMatrix4x4 view, QMatrix4x4 prevproj, QMatrix4x4 prevview) {
|
||||
QMatrix4x4 mvpm = proj * view;
|
||||
QMatrix4x4 pmvpm = prevproj * prevview;
|
||||
QMatrix3x3 nm = view.normalMatrix();
|
||||
//nm.in;
|
||||
prog->setUniformValue("qgl_ModelViewMatrix", view);
|
||||
prog->setUniformValue("qgl_ProjectionMatrix", proj);
|
||||
prog->setUniformValue("prev_ModelViewProjectioMatrix", pmvpm);
|
||||
prog->setUniformValue("qgl_ModelViewProjectionMatrix", mvpm);
|
||||
prog->setUniformValue("qgl_NormalMatrix", nm);
|
||||
//prog->setUniformValue("qgl_BumpMatrix", nm.);
|
||||
|
||||
@@ -27,7 +27,7 @@ class Light;
|
||||
|
||||
QString loadShaderFile(QGLShaderProgram * prog, QGLShader::ShaderType type, const QString & file);
|
||||
bool loadShaders(QGLShaderProgram * prog, const QString & name, const QString & dir = QString());
|
||||
void setUniformMatrices(QGLShaderProgram * prog, QMatrix4x4 proj, QMatrix4x4 view);
|
||||
void setUniformMatrices(QGLShaderProgram * prog, QMatrix4x4 proj, QMatrix4x4 view, QMatrix4x4 prevproj = QMatrix4x4(), QMatrix4x4 prevview = QMatrix4x4());
|
||||
void setUniformMap(QGLShaderProgram * prog, const Map & map, int channel, int def_channel);
|
||||
void setUniformMaterial(QGLShaderProgram * prog, const Material & mat);
|
||||
void setUniformLights(QGLShaderProgram * prog, const QVector<Light*> & lights, const QMatrix4x4 & mat, const QVector4D & dp);
|
||||
|
||||
@@ -38,6 +38,7 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow()
|
||||
view->setMouseSelectionEnabled(true);
|
||||
view->setSelectionHaloEnabled(true);
|
||||
view->setHoverHaloEnabled(true);
|
||||
view->setAccomodationEnabled(false);
|
||||
view->setHoverHaloFillAlpha(0.);
|
||||
view->setSelectionHaloFillAlpha(0.);
|
||||
view->setBackColor(Qt::lightGray);
|
||||
@@ -70,8 +71,8 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow()
|
||||
GLTextureManager::addSearchPath("data");
|
||||
GLTextureManager::addSearchPath("data/images");
|
||||
GLTextureManager::addSearchPath("data/SU-33_maps");
|
||||
obj = loadFromDAEFile("data/lights_r.dae");//new GLPrimitiveEllipsoid(EARTH_WL / 1E+6, EARTH_WL / 1E+6, EARTH_H / 1E+6, 500, 500);//GLPrimitiveCube();
|
||||
obj->setScale(0.1);
|
||||
obj = loadFromDAEFile("data/room.dae");//new GLPrimitiveEllipsoid(EARTH_WL / 1E+6, EARTH_WL / 1E+6, EARTH_H / 1E+6, 500, 500);//GLPrimitiveCube();
|
||||
//obj->setScale(0.1);
|
||||
//obj->child("Plane001")->material().map_specularity.color_amount = 0.95;
|
||||
//obj = new GLPrimitiveEllipsoid(100, 100, 100, 100, 100);//GLPrimitiveCube();
|
||||
for (int i = 0; i < obj->childCount(); ++i)
|
||||
@@ -100,13 +101,13 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow()
|
||||
|
||||
view->camera().setPos(QVector3D(10, -20, 20));
|
||||
view->camera().setAim(QVector3D());
|
||||
view->camera().flyToDistance(1000);
|
||||
view->camera().flyToDistance(500);
|
||||
//view->camera().setMode(Camera::AimMatrix);
|
||||
Light * l = new Light(view->camera().pos());
|
||||
l->intensity = 0.5;
|
||||
l->decay_linear = 0.2;
|
||||
l->intensity = 1.;
|
||||
//l->decay_linear = 0.2;
|
||||
l->setName("camera");
|
||||
//view->addObject(l);
|
||||
view->addObject(l);
|
||||
view->start(-1);
|
||||
//view->light(0)->light_type = Light::Omni;
|
||||
//obj = loadFrom3DSFile("34.3DS", 0.03);
|
||||
|
||||
@@ -24,7 +24,7 @@ QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) {
|
||||
setViewportUpdateMode(FullViewportUpdate);
|
||||
setCacheMode(CacheNone);
|
||||
QGLFormat f(QGL::DoubleBuffer | QGL::DepthBuffer | QGL::Rgba | QGL::AlphaChannel | QGL::DirectRendering | QGL::SampleBuffers);
|
||||
f.setSwapInterval(0);
|
||||
f.setSwapInterval(1);
|
||||
setViewport(new QGLWidget(f));
|
||||
setMouseTracking(true);
|
||||
setFocusPolicy(Qt::WheelFocus);
|
||||
|
||||
@@ -21,8 +21,15 @@
|
||||
|
||||
|
||||
RendererDeferredShading::RendererDeferredShading(QGLView * view_): GLRendererBase(view_),
|
||||
fbo_g(4, true, GL_RGBA16F), fbo_out(2, false, GL_RGB16F), fbo_hsmall(1, false, GL_RGB16F) {
|
||||
shader_fxaa = shader_ds_0 = shader_ds_1 = shader_hdr = shader_small = 0;
|
||||
fbo_g(5, true, GL_RGBA16F), fbo_out(2, false, GL_RGB16F), fbo_hsmall(1, false, GL_RGB16F) {
|
||||
shaders << ShaderPair("FXAA", &shader_fxaa)
|
||||
<< ShaderPair("dsl_pass_0", &shader_ds_0)
|
||||
<< ShaderPair("dsl_pass_1", &shader_ds_1)
|
||||
<< ShaderPair("hdr", &shader_hdr)
|
||||
<< ShaderPair("downscale", &shader_small)
|
||||
<< ShaderPair("motion_blur", &shader_motion_blur);
|
||||
for (int i = 0; i < shaders.size(); ++i)
|
||||
*(shaders[i].second) = 0;
|
||||
lights_per_pass = 2;
|
||||
exposure_ = 1.;
|
||||
df = new QWidget();
|
||||
@@ -40,27 +47,29 @@ fbo_g(4, true, GL_RGBA16F), fbo_out(2, false, GL_RGB16F), fbo_hsmall(1, false, G
|
||||
|
||||
|
||||
RendererDeferredShading::~RendererDeferredShading() {
|
||||
if (shader_fxaa != 0) delete shader_fxaa;
|
||||
if (shader_ds_0 != 0) delete shader_ds_0;
|
||||
if (shader_ds_1 != 0) delete shader_ds_1;
|
||||
if (shader_hdr != 0) delete shader_hdr;
|
||||
if (shader_small != 0) delete shader_small;
|
||||
for (int i = 0; i < shaders.size(); ++i) {
|
||||
QGLShaderProgram * p(*(shaders[i].second));
|
||||
if (p) delete p;
|
||||
}
|
||||
delete df;
|
||||
}
|
||||
|
||||
|
||||
void RendererDeferredShading::renderScene() {
|
||||
//qDebug() << lights_per_pass;
|
||||
QMatrix4x4 mproj = rp.proj_matrix;
|
||||
QMatrix4x4 mproji = rp.proj_matrix_i;
|
||||
QMatrix4x4 mview = rp.view_matrix;
|
||||
rp.prev_proj_matrix = prev_proj;
|
||||
rp.prev_view_matrix = prev_view;
|
||||
corner_dirs[0] = (QVector4D(-1, -1, 1, 1) * rp.viewproj_matrix).normalized();
|
||||
corner_dirs[1] = (QVector4D( 1, -1, 1, 1) * rp.viewproj_matrix).normalized();
|
||||
corner_dirs[2] = (QVector4D( 1, 1, 1, 1) * rp.viewproj_matrix).normalized();
|
||||
corner_dirs[3] = (QVector4D(-1, 1, 1, 1) * rp.viewproj_matrix).normalized();
|
||||
//qDebug() << corner_dirs[0] << corner_dirs[1] << corner_dirs[2] << corner_dirs[3];
|
||||
fbo_g.bind();
|
||||
int buffs[] = {0, 1, 2, 3};
|
||||
fbo_g.setWriteBuffers(buffs);
|
||||
int buffs[] = {0, 1, 2, 3, 4};
|
||||
fbo_g.setWriteBuffers(buffs, 5);
|
||||
if (white_image_id == 0) {
|
||||
glActiveTextureChannel(6);
|
||||
white_image_id = ((GLTextureManagerBase*)currentGLTextureManager)->loadTexture(white_image, false);
|
||||
@@ -84,7 +93,10 @@ void RendererDeferredShading::renderScene() {
|
||||
shader_ds_0->setUniformValue("t1", 1);
|
||||
shader_ds_0->setUniformValue("t2", 2);
|
||||
shader_ds_0->setUniformValue("t3", 3);
|
||||
shader_ds_0->setUniformValue("t4", 4);
|
||||
shader_ds_0->setUniformValue("dt", QVector2D(1. / view.viewport()->width(), 1. / view.viewport()->height()));
|
||||
//qDebug() << rp.view_matrix << prev_view;
|
||||
//shader_ds_0->setUniformValue("qgl_ModelViewMatrix", rp.view_matrix);
|
||||
renderObjects(GLObjectBase::Solid, 0, shader_ds_0, true, false, false);
|
||||
//glReleaseShaders();
|
||||
fbo_g.release();
|
||||
@@ -104,12 +116,13 @@ void RendererDeferredShading::renderScene() {
|
||||
shader_ds_1->setUniformValue("t1", 1);
|
||||
shader_ds_1->setUniformValue("t2", 2);
|
||||
shader_ds_1->setUniformValue("t3", 3);
|
||||
shader_ds_1->setUniformValue("td", 4);
|
||||
shader_ds_1->setUniformValue("t4", 4);
|
||||
shader_ds_1->setUniformValue("td", 5);
|
||||
shader_ds_1->setUniformValue("back_color", view.backColor());
|
||||
shader_ds_1->setUniformValue("mat_proji", mproji);
|
||||
shader_ds_1->setUniformValue("dt", QVector2D(1. / view.viewport()->width(), 1. / view.viewport()->height()));
|
||||
fbo_g.bindColorTextures();
|
||||
fbo_g.bindDepthTexture(4);
|
||||
fbo_g.bindDepthTexture(5);
|
||||
fbo_out.bind();
|
||||
fbo_out.setWriteBuffer(0);
|
||||
glClearFramebuffer(Qt::black, false);
|
||||
@@ -117,14 +130,14 @@ void RendererDeferredShading::renderScene() {
|
||||
//qDebug() << view_matrix;
|
||||
int passes = (view.lightsCount() - 1) / lights_per_pass + 1;
|
||||
if (passes < 1) passes = 1;
|
||||
shader_ds_1->setUniformValue("t_pp", 5);
|
||||
shader_ds_1->setUniformValue("t_pp", 6);
|
||||
//qDebug() << "render in" << passes << "passes (" << lights_per_pass << ")";
|
||||
int wi, ri;
|
||||
for (int l = 0; l < passes; ++l) {
|
||||
wi = 1 - l % 2;
|
||||
ri = l % 2;
|
||||
//qDebug() << " pass" << l << "read from" << ri << "write to" << wi;
|
||||
glActiveTextureChannel(5);
|
||||
glActiveTextureChannel(6);
|
||||
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri));
|
||||
fbo_out.setWriteBuffer(wi);
|
||||
setupDSLights(l, mview);
|
||||
@@ -135,52 +148,69 @@ void RendererDeferredShading::renderScene() {
|
||||
//glFinish();
|
||||
//break;
|
||||
}
|
||||
fbo_out.release();
|
||||
//fbo_out.release();
|
||||
wi = 1 - passes % 2;
|
||||
ri = passes % 2;
|
||||
glActiveTextureChannel(0);
|
||||
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri));
|
||||
|
||||
fbo_hsmall.bind();
|
||||
fbo_hsmall.setWriteBuffer(0);
|
||||
shader_small->bind();
|
||||
shader_small->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
|
||||
shader_small->setUniformValue("t0", 0);
|
||||
glDrawQuad(shader_small);
|
||||
hcontent.resize(fbo_hsmall.width() * fbo_hsmall.height());
|
||||
glReadPixels(0, 0, fbo_hsmall.width(), fbo_hsmall.height(), GL_RGB, GL_FLOAT, hcontent.data());
|
||||
GLfloat max[3] = {0.,0.,0.};//min[3] = {10000.,10000.,10000.}, ;
|
||||
for (int i = 0; i < hcontent.size(); ++i) {
|
||||
//if (min[0] > hcontent[i].x) min[0] = hcontent[i].x;
|
||||
if (max[0] < hcontent[i].x) max[0] = hcontent[i].x;
|
||||
//if (min[1] > hcontent[i].y) min[1] = hcontent[i].y;
|
||||
if (max[1] < hcontent[i].y) max[1] = hcontent[i].y;
|
||||
//if (min[2] > hcontent[i].z) min[2] = hcontent[i].z;
|
||||
if (max[2] < hcontent[i].z) max[2] = hcontent[i].z;
|
||||
}
|
||||
GLfloat mluma = (0.299 * max[0]) + (0.587 * max[1]) + (0.114 * max[2]);
|
||||
double nexp = mluma / 16., dexp = nexp - exposure_, mestep = exposure_ * view.accomodationMaxSpeed();
|
||||
dexp /= view.accomodationTime();
|
||||
if (dexp > 0. && dexp > mestep/4) dexp = mestep/4;
|
||||
if (dexp < 0. && dexp < -mestep) dexp = -mestep;
|
||||
exposure_ += dexp;
|
||||
label_exp->setText(QString("exposure: %1").arg(exposure_));
|
||||
label_exp_step->setText(QString("d_exposure: %1").arg(dexp));
|
||||
//qDebug() << min[0] << max[0] << min[1] << max[1] << min[2] << max[2];
|
||||
fbo_hsmall.release();
|
||||
if (view.isAccomodationEnabled()) {
|
||||
fbo_hsmall.bind();
|
||||
fbo_hsmall.setWriteBuffer(0);
|
||||
shader_small->bind();
|
||||
shader_small->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
|
||||
shader_small->setUniformValue("t0", 0);
|
||||
glDrawQuad(shader_small);
|
||||
hcontent.resize(fbo_hsmall.width() * fbo_hsmall.height());
|
||||
glReadPixels(0, 0, fbo_hsmall.width(), fbo_hsmall.height(), GL_RGB, GL_FLOAT, hcontent.data());
|
||||
GLfloat max[3] = {0.,0.,0.};//min[3] = {10000.,10000.,10000.}, ;
|
||||
for (int i = 0; i < hcontent.size(); ++i) {
|
||||
//if (min[0] > hcontent[i].x) min[0] = hcontent[i].x;
|
||||
if (max[0] < hcontent[i].x) max[0] = hcontent[i].x;
|
||||
//if (min[1] > hcontent[i].y) min[1] = hcontent[i].y;
|
||||
if (max[1] < hcontent[i].y) max[1] = hcontent[i].y;
|
||||
//if (min[2] > hcontent[i].z) min[2] = hcontent[i].z;
|
||||
if (max[2] < hcontent[i].z) max[2] = hcontent[i].z;
|
||||
}
|
||||
GLfloat mluma = (0.299 * max[0]) + (0.587 * max[1]) + (0.114 * max[2]);
|
||||
double nexp = mluma / 16., dexp = nexp - exposure_, mestep = exposure_ * view.accomodationMaxSpeed();
|
||||
dexp /= view.accomodationTime();
|
||||
if (dexp > 0. && dexp > mestep/4) dexp = mestep/4;
|
||||
if (dexp < 0. && dexp < -mestep) dexp = -mestep;
|
||||
exposure_ += dexp;
|
||||
label_exp->setText(QString("exposure: %1").arg(exposure_));
|
||||
label_exp_step->setText(QString("d_exposure: %1").arg(dexp));
|
||||
//qDebug() << min[0] << max[0] << min[1] << max[1] << min[2] << max[2];
|
||||
fbo_hsmall.release();
|
||||
|
||||
//glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri));
|
||||
fbo_out.bind();
|
||||
fbo_out.setWriteBuffer(wi);
|
||||
shader_hdr->bind();
|
||||
shader_hdr->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
|
||||
shader_hdr->setUniformValue("t0", 0);
|
||||
shader_hdr->setUniformValue("exposure", GLfloat(1./exposure_));
|
||||
glDrawQuad(shader_hdr);
|
||||
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(wi));
|
||||
piSwap<int>(wi, ri);
|
||||
}
|
||||
|
||||
//glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri));
|
||||
fbo_out.bind();
|
||||
fbo_out.setWriteBuffer(wi);
|
||||
shader_hdr->bind();
|
||||
shader_hdr->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
|
||||
shader_hdr->setUniformValue("t0", 0);
|
||||
shader_hdr->setUniformValue("exposure", GLfloat(1./exposure_));
|
||||
glDrawQuad(shader_hdr);
|
||||
glActiveTextureChannel(1);
|
||||
glBindTexture(GL_TEXTURE_2D, fbo_g.colorTexture(4));
|
||||
shader_motion_blur->bind();
|
||||
shader_motion_blur->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4());
|
||||
shader_motion_blur->setUniformValue("dt", QVector2D(1. / fbo_out.width(), 1. / fbo_out.height()));
|
||||
shader_motion_blur->setUniformValue("t0", 0);
|
||||
shader_motion_blur->setUniformValue("ts", 1);
|
||||
glDrawQuad(shader_motion_blur);
|
||||
glActiveTextureChannel(0);
|
||||
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(wi));
|
||||
piSwap<int>(wi, ri);
|
||||
|
||||
glReleaseShaders();
|
||||
fbo_out.release();
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(wi));
|
||||
glReleaseShaders();
|
||||
if (view.isFXAAEnabled()) {
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
@@ -193,6 +223,8 @@ void RendererDeferredShading::renderScene() {
|
||||
glDrawQuad();
|
||||
if (view.isFXAAEnabled())
|
||||
shader_fxaa->release();
|
||||
prev_proj = mproj;
|
||||
prev_view = mview;
|
||||
}
|
||||
|
||||
|
||||
@@ -211,16 +243,12 @@ void RendererDeferredShading::resize(int width, int height) {
|
||||
|
||||
|
||||
void RendererDeferredShading::reloadShaders() {
|
||||
if (shader_fxaa == 0) shader_fxaa = new QGLShaderProgram(view.context());
|
||||
if (shader_ds_0 == 0) shader_ds_0 = new QGLShaderProgram(view.context());
|
||||
if (shader_ds_1 == 0) shader_ds_1 = new QGLShaderProgram(view.context());
|
||||
if (shader_hdr == 0) shader_hdr = new QGLShaderProgram(view.context());
|
||||
if (shader_small == 0) shader_small = new QGLShaderProgram(view.context());
|
||||
loadShaders(shader_fxaa, "FXAA", "shaders");
|
||||
loadShaders(shader_ds_0, "dsl_pass_0", "shaders");
|
||||
loadShaders(shader_ds_1, "dsl_pass_1", "shaders");
|
||||
loadShaders(shader_hdr, "hdr", "shaders");
|
||||
loadShaders(shader_small, "downscale", "shaders");
|
||||
for (int i = 0; i < shaders.size(); ++i) {
|
||||
QGLShaderProgram * p(*(shaders[i].second));
|
||||
if (!p) p = new QGLShaderProgram(view.context());
|
||||
loadShaders(p, shaders[i].first, "shaders");
|
||||
*(shaders[i].second) = p;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -40,12 +40,15 @@ protected:
|
||||
void setupAmbientLight(const QColor & a, bool first_pass);
|
||||
|
||||
private:
|
||||
typedef QPair<QString, QGLShaderProgram **> ShaderPair;
|
||||
|
||||
int cplc, BUG[8], lights_per_pass;
|
||||
double exposure_;
|
||||
GLFramebuffer fbo_g, fbo_out, fbo_hsmall;
|
||||
QGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small;
|
||||
QGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small, * shader_motion_blur;
|
||||
QVector<ShaderPair> shaders;
|
||||
|
||||
QMatrix4x4 pm, mvm, mvpm, pim, mvim, mvpim;
|
||||
QMatrix4x4 prev_view, prev_proj;
|
||||
QMatrix3x3 nm;
|
||||
QVector4D corner_dirs[4];
|
||||
QVector<Vector3d> hcontent;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#version 150
|
||||
|
||||
in vec3 src_normal, normal;//, et;
|
||||
in vec4 pos;
|
||||
in vec4 pos, ppos;
|
||||
in float fogCoord;
|
||||
in mat3 TBN;
|
||||
|
||||
@@ -42,10 +42,14 @@ void main(void) {
|
||||
vec4 self = texture(qgl_Material.map_self_illumination.map, tc) * qgl_Material.map_self_illumination.amount + qgl_Material.map_self_illumination.offset;
|
||||
self *= qgl_Material.color_self_illumination;
|
||||
|
||||
vec3 speed = pos.xyz/pos.w - ppos.xyz/ppos.w;
|
||||
//speed /= abs(pos.z);
|
||||
|
||||
qgl_FragData[0] = vec4(dc.rgb, z);
|
||||
qgl_FragData[1] = vec4(n.xyz / 2. + vec3(0.5), specularity);
|
||||
qgl_FragData[2] = vec4(spec.rgb, hei);
|
||||
qgl_FragData[3] = vec4(self.rgb, pos.w);
|
||||
qgl_FragData[4] = vec4(speed,0);
|
||||
|
||||
//gl_FragData[0] = vec4(et.xyz, pos.w);
|
||||
//gl_FragDepth = gl_FragCoord.z - clamp(hei / pos.z / pos.z / (abs(n.z) + 1), -0.01, 0.01);
|
||||
|
||||
@@ -1,30 +1,36 @@
|
||||
#version 150
|
||||
|
||||
out vec3 src_normal, normal;//, et;
|
||||
out vec4 pos;
|
||||
out vec4 pos, ppos;
|
||||
out float fogCoord, fs_gid;
|
||||
out mat3 TBN;
|
||||
|
||||
uniform bool acc_fog;
|
||||
uniform vec2 dt;
|
||||
uniform vec3 eye;
|
||||
uniform mat4 prev_ModelViewProjectioMatrix;
|
||||
|
||||
void main(void) {
|
||||
normal = qgl_Normal;//(qgl_NormalMatrix * qgl_Normal);
|
||||
pos.xyzw = vec4(qgl_ModelViewMatrix * qgl_Vertex);
|
||||
TBN = (mat3(qgl_Tangent, qgl_Bitangent, qgl_Normal));
|
||||
pos = qgl_ftransform();
|
||||
TBN = mat3(qgl_Tangent, qgl_Bitangent, qgl_Normal);
|
||||
/*if (acc_fog) {
|
||||
fogCoord = (gl_Fog.end - length(pos.xyz) * 0.85) / (gl_Fog.end - gl_Fog.start);
|
||||
fogCoord = 1. - clamp(fogCoord, 0., 1.);
|
||||
}*/
|
||||
//gl_TexCoord[0] = gl_MultiTexCoord0;
|
||||
//gl_TexCoord[1] = gl_MultiTexCoord1;
|
||||
|
||||
src_normal = normalize(vec3(pos.xy * dt * 2., 0));
|
||||
|
||||
qgl_FragTexture = qgl_Texture;
|
||||
qgl_FragColor = qgl_Color;
|
||||
vec4 tp = qgl_ftransform();
|
||||
//tp /= tp.w;
|
||||
src_normal = normalize(vec3(pos.xy * dt * 2., 0));
|
||||
pos.w = tp.w;
|
||||
ppos = prev_ModelViewProjectioMatrix * qgl_Vertex;
|
||||
//pos.w = pos.w;
|
||||
//speed = tp - ppos;
|
||||
//speed /= (abs(speed) + 1.);
|
||||
//speed.xyz *= speed.w;
|
||||
//pos *= pos.w;
|
||||
gl_Position = tp;//ftransform();
|
||||
gl_Position = pos;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
in vec4 view_dir, view_pos;
|
||||
|
||||
uniform vec3 ambient;
|
||||
uniform sampler2D t0, t1, t2, t3, t_pp;
|
||||
uniform sampler2D t0, t1, t2, t3, t4, t_pp;
|
||||
uniform sampler2D td;
|
||||
uniform int gid, lightsCount;
|
||||
uniform float z_near, z_far;
|
||||
@@ -61,7 +61,7 @@ void main(void) {
|
||||
qgl_FragData[0] = back_color;
|
||||
return;
|
||||
}
|
||||
vec4 v1 = texture2D(t1, tc), v2 = texture2D(t2, tc), v3 = texture2D(t3, tc);
|
||||
vec4 v1 = texture2D(t1, tc), v2 = texture2D(t2, tc), v3 = texture2D(t3, tc), v4 = texture2D(t4, tc);
|
||||
vec2 sp = gl_FragCoord.xy * dt * 2 - vec2(1, 1);
|
||||
vec3 dc = v0.rgb, n = v1.xyz * 2. - vec3(1.);
|
||||
float height = v2.w;
|
||||
@@ -91,6 +91,6 @@ void main(void) {
|
||||
qgl_FragData[0].rgb = li * dc + si * v2.rgb + v3.rgb + texture(t_pp, tc).rgb;
|
||||
//qgl_FragData[0].rgb = vec3(abs(lpos.xyz - pos.xyz)/10);
|
||||
//qgl_FragData[0].rgb = si.rgb;
|
||||
//qgl_FragData[0].rgb = (v0.rgb)/2;
|
||||
//qgl_FragData[0].rgb = vec3(length(v4.xyz)/10);
|
||||
//qgl_FragData[0].a = 0.;
|
||||
}
|
||||
|
||||
24
qglview/shaders/motion_blur.frag
Normal file
24
qglview/shaders/motion_blur.frag
Normal file
@@ -0,0 +1,24 @@
|
||||
#version 150
|
||||
|
||||
uniform sampler2D t0, ts;
|
||||
uniform vec2 dt;
|
||||
uniform float factor;
|
||||
uniform int steps = 16;
|
||||
|
||||
void main(void) {
|
||||
vec2 cdt = dt / steps;
|
||||
vec2 ct = qgl_FragTexture.xy;
|
||||
vec3 speed = texture(ts, ct).rgb*1024;
|
||||
int hsteps = steps / 2;
|
||||
ct -= speed.xy * cdt * hsteps;
|
||||
vec3 scol = vec3(0);//texture(t0, ct).rgb;
|
||||
float sum = 0.;
|
||||
for (int i = 0; i < steps; ++i) {
|
||||
ct += speed.xy * cdt;
|
||||
float mul = 1. - abs(i - hsteps) * 2. / steps;
|
||||
scol += texture(t0, ct).rgb * mul;
|
||||
sum += mul;
|
||||
}
|
||||
scol /= sum;
|
||||
qgl_FragData[0].rgb = scol;
|
||||
}
|
||||
6
qglview/shaders/motion_blur.vert
Normal file
6
qglview/shaders/motion_blur.vert
Normal file
@@ -0,0 +1,6 @@
|
||||
#version 150
|
||||
|
||||
void main(void) {
|
||||
qgl_FragTexture = qgl_Texture;
|
||||
gl_Position = qgl_ftransform();
|
||||
}
|
||||
Reference in New Issue
Block a user