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

This commit is contained in:
2015-12-01 15:26:28 +00:00
parent 5ca76b651b
commit c8ceb3e328
13 changed files with 818 additions and 47 deletions

726
qglview/data/shadows.dae Normal file

File diff suppressed because one or more lines are too long

View File

@@ -40,7 +40,8 @@ GLFramebuffer::~GLFramebuffer() {
}
void GLFramebuffer::resize(int width, int height) {
void GLFramebuffer::resize(int width, int height, bool force) {
if ((wid == width) && (hei == height) && !force) return;
wid = width;
hei = height;
deleteGLFramebuffer(fbo);

View File

@@ -37,7 +37,7 @@ public:
QSize size() const {return QSize(wid, hei);}
QImage grab() const;
void resize(int width, int height);
void resize(int width, int height, bool force = false);
void bind();
void release();
void setReadBuffer(int index) {glReadBuffer(GL_COLOR_ATTACHMENT0 + index);}

View File

@@ -210,7 +210,7 @@ void GLObjectBase::render(int * id, QMap<int, GLObjectBase * > * ids, int sh_id_
Light::Light(): GLObjectBase(), shadow_map(1, true, GL_R16F) {
Light::Light(): GLObjectBase(), shadow_map(0, true, GL_R16F) {
type_ = GLObjectBase::Light;
light_type = Omni;
intensity = 1.;
@@ -221,7 +221,7 @@ Light::Light(): GLObjectBase(), shadow_map(1, true, GL_R16F) {
}
Light::Light(const QVector3D & p, const QColor & c, GLdouble i): GLObjectBase(), shadow_map(1, true, GL_R16F) {
Light::Light(const QVector3D & p, const QColor & c, GLdouble i): GLObjectBase(), shadow_map(0, true, GL_R16F) {
type_ = GLObjectBase::Light;
light_type = Omni;
pos_ = p;
@@ -261,10 +261,20 @@ void Light::draw(QGLShaderProgram * prog, bool simplest) {
bool l = glIsEnabled(GL_LIGHTING);
glDisable(GL_LIGHTING);
glPointSize(8.);
glBegin(GL_POINTS);
glColor3f(0., 0., 0.);
glBegin(GL_POINTS);
glVertex3f(0., 0., 0.);
glEnd();
double s = 10;
if (light_type != Omni) {
glBegin(GL_LINES);
QVector4D dir = QVector4D(direction);
if (raw_matrix)
dir = transform().inverted() * dir;
glVertex3f(0., 0., 0.);
glVertex3f(dir.x() * s, dir.y() * s, dir.z() * s);
glEnd();
}
if (l) glEnable(GL_LIGHTING);
}

View File

@@ -233,10 +233,10 @@ void GLRendererBase::renderShadow(Light * l, QGLShaderProgram * prog, QMatrix4x4
Camera cam;
QVector3D wp = l->worldPos();
cam.setPos(wp);
cam.setAim(wp + (l->worldTransform() * QVector4D(l->direction)).toVector3D());
cam.setAim(wp + (/*l->worldTransform() */ QVector4D(l->direction)).toVector3D());
cam.setDepthStart(view.camera().depthStart());
cam.setDepthEnd(view.camera().depthEnd());
cam.setFOV(l->angle_end / 2.);
cam.setFOV(l->angle_end);
cam.apply(1.);
RenderingParameters rpl;
rpl.pass = GLObjectBase::Solid;
@@ -244,7 +244,11 @@ void GLRendererBase::renderShadow(Light * l, QGLShaderProgram * prog, QMatrix4x4
rpl.textures = rpl.light = rpl.fog = false;
rpl.view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX);
rpl.proj_matrix = getGLMatrix(GL_PROJECTION_MATRIX);
l->shadow_matrix = mat * (rpl.proj_matrix * rpl.view_matrix);
QMatrix4x4 mbias;
mbias.scale(0.5, 0.5, 0.5);
mbias.translate(1., 1., 1.);
l->shadow_matrix = mbias*rpl.proj_matrix*rpl.view_matrix*mat;//;// * mbias;
//qDebug() << mbias;
//glPushMatrix();
renderSingleShadow(view.objects_, rpl);
//glPopMatrix();

View File

@@ -52,7 +52,7 @@ const char qgl_uniform[] =
"uniform mat4 qgl_ModelViewProjectionMatrixInverseTranspose;\n";
const char qgl_structs[] =
"const int qgl_MaxLights = 16;\n"
"const int qgl_MaxLights = 8;\n"
"struct QGLLight {\n"
" vec4 color;\n"
" vec4 position;\n"
@@ -65,7 +65,7 @@ const char qgl_structs[] =
" float constantAttenuation;\n"
" float linearAttenuation;\n"
" float quadraticAttenuation;\n"
" sampler2D shadow;\n"
" sampler2DShadow shadow;\n"
" mat4 shadowMatrix;\n"
"};\n"
"struct QGLMap {\n"
@@ -216,7 +216,7 @@ void setUniformLight(QGLShaderProgram * prog, Light * light, QString ulightn, co
QMatrix4x4 m = mat * light->worldTransform();
QVector4D pos(0, 0, 0, 1.), dir(light->direction);
pos = m * pos;
dir = (m * dir).normalized();
dir = (mat * dir).normalized();
double ang_start = light->angle_start / 2., ang_end = light->angle_end / 2.;
if (light->light_type == Light::Omni)
ang_start = ang_end = 180.;

View File

@@ -70,7 +70,7 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow()
GLTextureManager::addSearchPath("data");
GLTextureManager::addSearchPath("data/images");
GLTextureManager::addSearchPath("data/SU-33_maps");
obj = loadFromDAEFile("data/room.dae");//new GLPrimitiveEllipsoid(EARTH_WL / 1E+6, EARTH_WL / 1E+6, EARTH_H / 1E+6, 500, 500);//GLPrimitiveCube();
obj = loadFromDAEFile("data/shadows.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();
@@ -103,11 +103,11 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow()
view->camera().flyToDistance(500);
//view->camera().setMode(Camera::AimMatrix);
Light * l = new Light(view->camera().pos());
l->light_type = Light::Cone;
/*l->light_type = Light::Cone;
l->direction = QVector3D(1., 0.2, -0.2);
l->angle_start = 0.;
l->angle_end = 120.;
l->intensity = 1.;
l->angle_end = 120.;*/
l->intensity = 0.5;
//l->decay_linear = 0.2;
l->setName("camera");
view->addObject(l);
@@ -225,6 +225,15 @@ void MainWindow::glInit() {
}
void MainWindow::on_pushButton_clicked() {
//view->removeLight(view->lightsCount() - 1);
//setWindowTitle(QString::number(view->lightsCount()));
QVector3D wp = view->light(0)->worldPos();
view->camera().setPos(wp);
view->camera().setAim(wp + (view->light(0)->worldTransform() * QVector4D(view->light(0)->direction)).toVector3D()*100);
}
void MainWindow::loadFile(const QString & path) {
prev_path = path;
QCursor pcur = cursor();

View File

@@ -81,7 +81,7 @@ private slots:
void on_spinBloomThreshold_valueChanged(double val) {view->setFeature(QGLView::qglBloomThreshold, val);}
//void on_spinSliderShine_valueChanged(double val) {obj->material().shine_strength = val; obj->setMaterial(obj->material(), true);}
//void on_spinSliderRough_valueChanged(double val) {obj->material().shine = val; obj->setMaterial(obj->material(), true);}
void on_pushButton_clicked() {view->removeLight(view->lightsCount() - 1); setWindowTitle(QString::number(view->lightsCount()));}
void on_pushButton_clicked();
void on_pushButton_2_clicked() {view->reloadShaders();}
void on_pushButton_3_clicked();
void on_comboBox_currentIndexChanged(int val);

View File

@@ -138,7 +138,7 @@ void QGLView::drawBackground(QPainter * painter, const QRectF & rect) {
void QGLView::initializeGL() {
//qDebug() << "init glview";
qDebug() << "init glview";
makeCurrent();
currentQGLView = (QGLWidget * )viewport();
currentGLTextureManager = &textures_manager;
@@ -188,6 +188,7 @@ void QGLView::initializeGL() {
//shader_rope = new QGLShaderProgram(context());
reloadThisShaders();
is_init = true;
resizeGL(viewport()->width(), viewport()->height());
//dynamic_cubemap.loadPathesFromDirectory("e");
//dynamic_cubemap.load();
@@ -271,7 +272,7 @@ void QGLView::paintGL() {
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
}
camera().apply(aspect);
static GLRendererBase * prev_rend = 0;
@@ -470,7 +471,8 @@ void QGLView::collectObjectLights(GLObjectBase * o) {
void QGLView::checkCaps() {
glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max_anisotropic);
glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &max_texture_chanels);
//glGetIntegerv(GL_MAX_TEXTURE_UNITS, &max_texture_chanels);
//qDebug() << max_texture_chanels;
//qDebug() << max_texture_chanels;
shaders_supported = QGLShaderProgram::hasOpenGLShaderPrograms();
}
@@ -501,8 +503,10 @@ void QGLView::applyFog() {
void QGLView::resizeGL(int width, int height) {
if (!is_init) return;
aspect = double(width) / double(height);
if (renderer_ != 0) renderer_->resize(width, height);
qDebug() << "resize" << width << height;
fbo_selection.resize(width, height);
mouse_first = true;
iaspect = (aspect == 0.) ? 0. : 1 / aspect;

View File

@@ -34,7 +34,7 @@ fbo_g(5, true, GL_RGBA16F), fbo_out(3, false, GL_RGB16F), fbo_hsmall(1, false, G
<< ShaderPair("shadow", &shader_shadow);
for (int i = 0; i < shaders.size(); ++i)
*(shaders[i].second) = 0;
lights_per_pass = 2;
lights_per_pass = 8;
exposure_ = 1.;
df = new QWidget();
df->setLayout(new QBoxLayout(QBoxLayout::TopToBottom));
@@ -64,7 +64,8 @@ void RendererDeferredShading::renderScene() {
QMatrix4x4 mproj = rp.proj_matrix;
QMatrix4x4 mproji = rp.proj_matrix_i;
QMatrix4x4 mview = rp.view_matrix;
QMatrix4x4 mprojviewi = rp.view_matrix_i * rp.proj_matrix_i;
QMatrix4x4 mviewi = rp.view_matrix_i;
QMatrix4x4 mviewproji = (mview * mproj).inverted();
rp.prev_proj_matrix = prev_proj;
rp.prev_view_matrix = prev_view;
corner_dirs[0] = (QVector4D(-1, -1, 1, 1) * rp.viewproj_matrix).normalized();
@@ -106,8 +107,8 @@ void RendererDeferredShading::renderScene() {
//glReleaseShaders();
fbo_g.release();
shader_shadow->bind();
if (view.isFeatureEnabled(QGLView::qglShadowsEnabled)) {
shader_shadow->bind();
int sms = view.feature(QGLView::qglShadowsMapSize).toInt();
glDisable(GL_TEXTURE_1D);
glDisable(GL_TEXTURE_2D);
@@ -126,10 +127,10 @@ void RendererDeferredShading::renderScene() {
if (l->light_type == Light::Omni) continue;
l->shadow_map.resize(sms, sms);
l->shadow_map.bind();
l->shadow_map.setWriteBuffer(0);
glClearFramebuffer();
//glClear(GL_DEPTH_BUFFER_BIT);
renderShadow(l, shader_shadow, mprojviewi);
//l->shadow_map.setWriteBuffer(0);
//glClearFramebuffer();
glClear(GL_DEPTH_BUFFER_BIT);
renderShadow(l, shader_shadow, mviewi);
l->shadow_map.release();
}
}
@@ -153,6 +154,8 @@ void RendererDeferredShading::renderScene() {
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("mat_viewi", mviewi);
shader_ds_1->setUniformValue("mat_viewproji", mviewproji);
shader_ds_1->setUniformValue("dt", QVector2D(1. / view.viewport()->width(), 1. / view.viewport()->height()));
rp.setUniform(shader_ds_1);
fbo_g.bindColorTextures();
@@ -175,11 +178,7 @@ void RendererDeferredShading::renderScene() {
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri));
fbo_out.setWriteBuffer(wi);
setupDSLights(l, mview);
//shader_ds_1->setUniformValue("lightsCount", cplc);
glDrawQuad(shader_ds_1);
//renderObjects(GLObjectBase::Solid, l, 0, true, true, view.isFogEnabled());
//renderObjects(GLObjectBase::Transparent, l, 0, true, true, view.isFogEnabled());
//glFinish();
//break;
}
//fbo_out.release();
@@ -365,7 +364,10 @@ void RendererDeferredShading::setupDSLights(int pass, const QMatrix4x4 & view_ma
for (int i = light_start; i < light_end; ++i) {
lv << view.lights()[i];
glActiveTextureChannel(shadow_start + i - light_start);
glBindTexture(GL_TEXTURE_2D, lv.back()->shadow_map.colorTexture());
glBindTexture(GL_TEXTURE_2D, lv.back()->shadow_map.depthTexture());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
}
amb_light.setName("null");
for (int i = light_end; i < lmax; ++i)

View File

@@ -11,12 +11,12 @@ uniform float z_near, z_far;
uniform bool firstPass;
uniform vec2 dt;
uniform vec4 back_color;
uniform mat4 mat_proji;
uniform mat4 mat_proji, mat_viewi, mat_viewproji;
float light_diffuse(int model, vec3 l, vec3 n) {return max(0., dot(l, n));}
float light_specular(int model, vec3 l, vec3 n, vec3 h, vec3 v, float shininess) {return max(0., pow(dot(n, h), shininess));}
vec4 pos, lpos;
vec4 pos, lpos, shp;
vec3 li, si, ldir, halfV;
float sh_pow, sh_mul, dist, NdotL, NdotH, spot, ldist, diff;
@@ -36,6 +36,25 @@ void calcLight(in int index, in vec3 n, in vec3 v, in vec4 v2) {
//spot = clamp(scos / (-qgl_Light[index].endAngleCos + qgl_Light[index].startAngleCos + 0.0001),0,1);
spot *= smoothstep(qgl_Light[index].endAngleCos, qgl_Light[index].startAngleCos, scos);
//spot = pow(spot, (qgl_Light[index].spotExponent + 0.001));
shp = qgl_Light[index].shadowMatrix*vec4(pos.xyz,1);
shp.z -= 0.1;
///spot *= textureProj(qgl_Light[index].shadow, shp);
float ds = shp.z / 100, dds = ds + ds;
float shadow = textureProj(qgl_Light[index].shadow, vec4(shp.xy, shp.zw))/* +
textureProj(qgl_Light[index].shadow, vec4(shp.xy + vec2( 0, ds), shp.zw)) +
textureProj(qgl_Light[index].shadow, vec4(shp.xy + vec2( 0, -ds), shp.zw)) +
textureProj(qgl_Light[index].shadow, vec4(shp.xy + vec2( ds, 0), shp.zw)) +
textureProj(qgl_Light[index].shadow, vec4(shp.xy + vec2( -ds, 0), shp.zw)) +
textureProj(qgl_Light[index].shadow, vec4(shp.xy + vec2( ds, ds), shp.zw)) +
textureProj(qgl_Light[index].shadow, vec4(shp.xy + vec2( ds, -ds), shp.zw)) +
textureProj(qgl_Light[index].shadow, vec4(shp.xy + vec2( -ds, -ds), shp.zw)) +
textureProj(qgl_Light[index].shadow, vec4(shp.xy + vec2( -ds, ds), shp.zw)) +
textureProj(qgl_Light[index].shadow, vec4(shp.xy + vec2( dds, 0), shp.zw)) +
textureProj(qgl_Light[index].shadow, vec4(shp.xy + vec2(-dds, 0), shp.zw)) +
textureProj(qgl_Light[index].shadow, vec4(shp.xy + vec2( 0, dds), shp.zw)) +
textureProj(qgl_Light[index].shadow, vec4(shp.xy + vec2( 0, -dds), shp.zw))*/;
spot *= shadow / 1.;
///spot *= textureProj(qgl_Light[index].shadow, shp);
}
spot /= (qgl_Light[index].constantAttenuation + ldist * (qgl_Light[index].linearAttenuation + ldist * qgl_Light[index].quadraticAttenuation));
///li += spot * gl_LightSource[index].diffuse.rgb * light_diffuse(0, ldir, n);
@@ -86,16 +105,16 @@ void main(void) {
sh_pow = 1. / max((1. - v1.w), 0.0001);
sh_mul = max(1. - v1.w, 0.0001);
for (int i = 0; i < 1; ++i)
calcLight(i, n, v, v2);
//for (int i = 0; i < 8; ++i)
// calcLight(i, n, v, v2);
calcLight(4, n, v, v2);
qgl_FragData[0].rgb = li * dc + si * v2.rgb + v3.rgb + texture(t_pp, tc).rgb;
qgl_FragData[0].rgb = li * dc + si * v2.rgb + v3.rgb + texelFetch(t_pp, tc, 0).rgb;
//qgl_FragData[0].rgb = vec3(abs(lpos.xyz - pos.xyz)/10);
//qgl_FragData[0].rgb = vec3(ldist/1000);
vec2 shp = (vec4(qgl_FragTexture.xy, 1, 1) *transpose(qgl_Light[0].shadowMatrix)).xy;
float shd = 1./texture(qgl_Light[0].shadow, shp).r;
shd = shd*shd;// - ldist;
qgl_FragData[0].rgb = vec3(abs(shd)/1000000);
//qgl_FragData[0].rgb = vec3(*1000);
//qgl_FragData[0].rgb = li + vec3(texelFetch(t_pp, tc, 0).xyz);
//shd = shd - shp.w;
//qgl_FragData[0].rgb = vec3(abs(shd)/10000);
//qgl_FragData[0].rgb = vec3((shp.z)/1000);
//qgl_FragData[0].rgb = vec3(abs(pos.xyz)/1000);
//qgl_FragData[0].a = 0.;
}

View File

@@ -1,7 +1,5 @@
#version 150
in vec4 pos;
void main(void) {
qgl_FragData[0].r = 1. / pos.w;
}

View File

@@ -1,9 +1,7 @@
#version 150
out vec4 pos;
void main(void) {
pos = qgl_ftransform();
qgl_FragTexture = qgl_Texture;
gl_Position = pos;
gl_Position = qgl_ftransform();
}