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

This commit is contained in:
2015-11-26 21:42:43 +00:00
parent 4cbcbb5174
commit 59eb135a60
14 changed files with 419 additions and 42861 deletions

File diff suppressed because one or more lines are too long

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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;
}

View File

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