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

This commit is contained in:
2015-12-04 13:59:10 +00:00
parent 6ab9283a18
commit 822e1518ce
15 changed files with 70 additions and 51 deletions

View File

@@ -59,13 +59,27 @@ void Camera::apply(const GLdouble & aspect) {
pm.rotate(angles_.z(), 0., 0., 1.);
//pm.translate(-aim_);
if (parent_) {
pm.translate(-aim_);
pm *= parent_->worldTransform().inverted();
//double dist = pm(2, 3);
QMatrix4x4 pmat = parent_->worldTransform();//.inverted();
//offset_.setZ(offset_.z() - dist);
offset_ = pmat.column(3).toVector3D();
pmat(0, 3) = pmat(1, 3) = pmat(2, 3) = 0.;
pmat.translate(aim_);
//pm.translate(-aim_);
pm *= pmat.inverted();
//qDebug() << pmat;
}
setGLMatrix(pm);
//qDebug() << angles_;
}
QMatrix4x4 Camera::offsetMatrix() const {
QMatrix4x4 ret;
ret.translate(parent_ ? -offset_ : -aim_);
return ret;
}
/*
void Camera::localTransform(QMatrix4x4 & m) {
return;

View File

@@ -89,10 +89,12 @@ public:
void assign(const Camera & c);
//QVector3D pointFromViewport(int x_, int y_, double z_); TODO
QMatrix4x4 offsetMatrix() const;
private:
//void localTransform(QMatrix4x4 & m);
QVector3D aim_;
QVector3D aim_, offset_;
GLdouble fov_;
GLdouble depth_start;
GLdouble depth_end;

View File

@@ -150,7 +150,7 @@ void GLObjectBase::buildTransform() {
if (p != 0)
itransform_ = p->itransform_;
if (raw_matrix) {
itransform_.translate(is_root ? dcam_pos_ : pos_);
itransform_.translate(pos_);
itransform_ *= mat_;
//qDebug() << "raw_matrix" << itransform_;
} else
@@ -162,7 +162,7 @@ void GLObjectBase::buildTransform() {
void GLObjectBase::localTransform(QMatrix4x4 & m) {
m.translate(is_root ? dcam_pos_ : pos_);
m.translate(pos_);
m.rotate(angles_.z(), 0., 0., 1.);
m.rotate(angles_.y(), 0., 1., 0.);
m.rotate(angles_.x(), 1., 0., 0.);
@@ -176,12 +176,6 @@ void GLObjectBase::checkPass() {
}
void GLObjectBase::preparePos(const Camera & cam) {
dcam_pos_ = pos_ - cam.aim();
buildTransform();
}
QMatrix4x4 GLObjectBase::worldMatrix(QMatrix4x4 parent) const {
QMatrix4x4 mat;
mat.translate(pos_);
@@ -217,7 +211,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.;
@@ -228,7 +222,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;

View File

@@ -168,8 +168,6 @@ public:
const Box3D & boundingBox(bool withChildren = true) const {return bound;}
GLVBO & VBO() {return vbo;}
void preparePos(const Camera & cam);
QVector3D pos_h;
QVector<Vector3d> points, puvws;
QVector<Vector3i> faces, uvws, norms;
@@ -198,7 +196,7 @@ protected:
RenderMode render_mode;
Material material_;
Box3D bound;
QVector3D pos_, angles_, scale_, dcam_pos_;
QVector3D pos_, angles_, scale_;
QList<GLObjectBase * > children_;
QList<GLuint> textures;
QMatrix4x4 itransform_, mat_;

View File

@@ -164,6 +164,7 @@ void GLRendererBase::renderObjects(int pass, int light_pass, void * shaders, boo
rpl.prev_view_matrix = rp.prev_view_matrix;
rpl.proj_matrix = rp.proj_matrix;
rpl.prev_proj_matrix = rp.prev_proj_matrix;
rpl.cam_offset_matrix = view.camera().offsetMatrix();
//qDebug() << "view:" << rp.view_matrix;
for (int i = 0; i < 32; ++i) rpl.prev_tex[i] = 0;
setupTextures(view.objects_, rpl, true);
@@ -187,7 +188,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_, prevview = rpl.prev_view_matrix * o.itransform_;
QMatrix4x4 curview = rpl.view_matrix * rpl.cam_offset_matrix * o.itransform_, prevview = rpl.prev_view_matrix * rpl.cam_offset_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));
@@ -251,10 +252,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);
rpl.cam_offset_matrix = cam.offsetMatrix();
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;
l->shadow_matrix = mbias*rpl.proj_matrix*rpl.view_matrix*rpl.cam_offset_matrix*mat;//;// * mbias;
//qDebug() << mbias;
//glPushMatrix();
renderSingleShadow(view.objects_, rpl);
@@ -268,10 +270,10 @@ void GLRendererBase::renderSingleShadow(GLObjectBase & o, RenderingParameters &
if (!o.visible_) return;
if (rpl.shaders) {
//qDebug() << o.name() << curview << curview.determinant();
setUniformMatrices((QGLShaderProgram*)rpl.shaders, rpl.proj_matrix, rpl.view_matrix * o.itransform_);
setUniformMatrices((QGLShaderProgram*)rpl.shaders, rpl.proj_matrix, rpl.view_matrix * rpl.cam_offset_matrix * o.itransform_);
} else {
glMatrixMode(GL_MODELVIEW);
setGLMatrix(rpl.view_matrix * o.itransform_);
setGLMatrix(rpl.view_matrix * rpl.cam_offset_matrix * o.itransform_);
}
glPolygonMode(GL_FRONT_AND_BACK, o.render_mode != GLObjectBase::View ? o.render_mode : (view.rmode != GLObjectBase::View ? view.rmode : GL_FILL));
glLineWidth(o.line_width > 0. ? o.line_width : view.lineWidth_);

View File

@@ -48,6 +48,7 @@ protected:
QMatrix4x4 proj_matrix, proj_matrix_i, prev_proj_matrix;
QMatrix4x4 viewproj_matrix, viewproj_matrix_i;
QMatrix3x3 normal_matrix;
QMatrix4x4 cam_offset_matrix;
QGLShaderProgram * cur_shader;
};

View File

@@ -238,6 +238,7 @@ void setUniformLight(QGLShaderProgram * prog, Light * light, QString ulightn, co
prog->setUniformValue((ulightn + ".shadow").toLatin1().constData(), shadow);
prog->setUniformValue((ulightn + ".shadowColor").toLatin1().constData(), shadow);
prog->setUniformValue((ulightn + ".shadowMatrix").toLatin1().constData(), light->shadow_matrix);
//qDebug() << light->shadow_matrix;
//prog->setUniformValue((ulightn + ".shadowDir0").toLatin1().constData(), (mat * dir0));
//prog->setUniformValue((ulightn + ".shadowDir1").toLatin1().constData(), (mat * dir1));
//qDebug() << light->direction << light->dir0 << light->dir1;

View File

@@ -80,8 +80,12 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow()
//((Light*)obj->child(i))->decay_linear = .5;
}
view->addObject(obj);
obj->setPos(1000000, -1000000, -10000000);
obj->child("Box001")->addChild(&(view->camera()));
//view->camera().flyToDistance(30);
view->camera().setPos(QVector3D(10, -20, 20));
//view->camera().setAim(obj->pos());
view->camera().flyToDistance(500);
double al = 7.;
obj = new GLPrimitiveLine(QVector3D(0, 0, -al), QVector3D(0, 0, al));
@@ -98,9 +102,6 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow()
obj = new GLPrimitiveLine(QVector3D(), QVector3D(cos(lng)*cos(lat), sin(lng)*cos(lat), sin(lat)/*(EARTH_H/EARTH_WL)*/)*5);
view->addObject(obj);
view->camera().setPos(QVector3D(10, -20, 20));
view->camera().setAim(QVector3D());
view->camera().flyToDistance(500);
//view->camera().setMode(Camera::AimMatrix);
Light * l = new Light(view->camera().pos());
/*l->light_type = Light::Cone;

View File

@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>1131</width>
<height>772</height>
<height>781</height>
</rect>
</property>
<property name="windowTitle">
@@ -513,6 +513,9 @@
<property name="text">
<string>soft shadows</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
@@ -530,9 +533,6 @@
<property name="text">
<string>accomodation</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
@@ -680,7 +680,6 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<zorder>tabWidget</zorder>
</widget>
</item>
</layout>

View File

@@ -72,7 +72,7 @@ QGLView::QGLView(QWidget * parent): QGraphicsView(parent), fbo_selection(3) {
setFeature(qglMotionBlurSteps, 8);
setFeature(qglShadowsEnabled, false);
setFeature(qglShadowsMapSize, 512);
setFeature(qglShadowsSoftEnabled, false);
setFeature(qglShadowsSoftEnabled, true);
setFeature(qglDynamicReflectionsEnabled, false);
setFeature(qglDynamicReflectionsMapSize, 512);
mouse_first = mouseSelect_ = hoverHalo_ = selectionHalo_ = true;
@@ -213,7 +213,8 @@ void QGLView::paintGL() {
glEnable(GL_CULL_FACE);
//glDisable(GL_CULL_FACE);
camera().apply(aspect);
objects_.preparePos(camera());
//objects_.preparePos(camera());
start_rp.cam_offset_matrix = camera().offsetMatrix();
start_rp.proj_matrix = getGLMatrix(GL_PROJECTION_MATRIX);
start_rp.view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX);
//objects_.buildTransform();
@@ -276,7 +277,8 @@ void QGLView::paintGL() {
}
camera().apply(aspect);
objects_.preparePos(camera());
start_rp.cam_offset_matrix = camera().offsetMatrix();
//objects_.preparePos(camera());
static GLRendererBase * prev_rend = 0;
if (prev_rend != renderer_) {
@@ -422,7 +424,7 @@ void QGLView::renderSingleSelection(GLObjectBase & o) {
o.loadTextures();
}
if (!o.visible_ || !o.select_) return;
QMatrix4x4 curview = start_rp.view_matrix * o.itransform_;
QMatrix4x4 curview = start_rp.view_matrix * start_rp.cam_offset_matrix * o.itransform_;
ids.insert(cid, &o);
if (shaders_supported){
setUniformMatrices(shader_select, start_rp.proj_matrix, curview);

View File

@@ -66,6 +66,8 @@ void RendererDeferredShading::renderScene() {
QMatrix4x4 mview = rp.view_matrix;
QMatrix4x4 mviewi = rp.view_matrix_i;
QMatrix4x4 mviewproji = (mview * mproj).inverted();
QMatrix4x4 moffset = view.camera().offsetMatrix();
QMatrix4x4 moffseti = moffset.inverted();
rp.prev_proj_matrix = prev_proj;
rp.prev_view_matrix = prev_view;
QMatrix4x4 vc_proji;
@@ -133,7 +135,7 @@ void RendererDeferredShading::renderScene() {
l->shadow_map.setWriteBuffer(0);
glClearFramebuffer();
//glClear(GL_DEPTH_BUFFER_BIT);
renderShadow(l, shader_shadow, mviewi);
renderShadow(l, shader_shadow, moffseti*mviewi);
l->shadow_map.release();
}
}
@@ -160,6 +162,7 @@ void RendererDeferredShading::renderScene() {
shader_ds_1->setUniformValue("mat_view", mview);
shader_ds_1->setUniformValue("mat_viewi", mviewi);
shader_ds_1->setUniformValue("mat_viewproji", mviewproji);
shader_ds_1->setUniformValue("shadow_on", view.isFeatureEnabled(QGLView::qglShadowsEnabled) ? 1 : 0);
shader_ds_1->setUniformValue("dt", QVector2D(1. / view.viewport()->width(), 1. / view.viewport()->height()));
rp.setUniform(shader_ds_1);
fbo_g.bindColorTextures();
@@ -181,7 +184,7 @@ void RendererDeferredShading::renderScene() {
glActiveTextureChannel(6);
glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(ri));
fbo_out.setWriteBuffer(wi);
setupDSLights(l, mview);
setupDSLights(l, mview * moffset);
glDrawQuad(shader_ds_1, corner_dirs);
//break;
}
@@ -369,8 +372,13 @@ void RendererDeferredShading::setupDSLights(int pass, const QMatrix4x4 & view_ma
lv << view.lights()[i];
glActiveTextureChannel(shadow_start + i - light_start);
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);
if (view.isFeatureEnabled(QGLView::qglShadowsSoftEnabled)) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
} else {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
}
amb_light.setName("null");

View File

@@ -71,6 +71,7 @@ void RendererSimple::renderScene() {
glDepthFunc(GL_EQUAL);
}
view.camera().apply(view.aspect);
rp.cam_offset_matrix = view.camera().offsetMatrix();
rp.prepare();
setupLights(l, 8);

View File

@@ -7,7 +7,7 @@ in vec4 view_pos;
uniform vec3 ambient;
uniform sampler2D t0, t1, t2, t3, t4, t_pp;
uniform sampler2D td;
uniform int gid, lightsCount;
uniform int gid, lightsCount, shadow_on;
uniform float z_near, z_far;
uniform bool firstPass;
uniform vec2 dt;
@@ -23,11 +23,7 @@ vec3 vds, vds2;
float sh_pow, sh_mul, dist, NdotL, NdotH, spot, ldist, diff, sdist, shadow;
float getShadow(int light, vec3 view_pos, vec3 dpos) {
//shp = mat_viewi * vec4(view_pos, 1);
//shp += vec4(dpos, 0);
shp = qgl_Light[light].shadowMatrix * vec4(view_pos, 1);
//shp.xyz /= shp.w;
shp.z -= 0.1;
return textureProj(qgl_Light[light].shadow, shp);
}
@@ -74,7 +70,7 @@ void calcLight(in int index, in vec3 n, in vec3 v, in vec4 v2) {
getShadow(index, pos.xyz, vds + vds2 + vds2) +
getShadow(index, pos.xyz, - vds - vds2 - vds2) +
getShadow(index, pos.xyz, - vds + vds2 + vds2)*/;
spot *= shadow;// / 29.;
spot *= mix(1., shadow, shadow_on);// / 29.;
}
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);
@@ -116,6 +112,7 @@ void main(void) {
pos.xy *= v0.z;
pos.z = posz;*/
pos.w = 1;
pos.xyz = view_dir * v0.w;
pos.z = -pos.z;
@@ -137,7 +134,6 @@ 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(abs(shp.xy/shp.w)/1,0);
//qgl_FragData[0].rgb = li + vec3(texelFetch(t_pp, tc, 0).xyz);
//shd = shd - shp.w;

View File

@@ -16,14 +16,14 @@ vec3 Uncharted2Tonemap(vec3 x) {
}
void main(void) {
qgl_FragData[0].rgb = texelFetch(t0, ivec2(gl_FragCoord.xy), 0).rgb;
return;
//qgl_FragData[0].rgb = texelFetch(t0, ivec2(gl_FragCoord.xy), 0).rgb;
//return;
vec3 inColor = texelFetch(t0, ivec2(gl_FragCoord.xy), 0).rgb;
inColor *= exposure;
float ExposureBias = 1;
inColor *= exposure / 1.45;
float ExposureBias = 1.;
vec3 curr = Uncharted2Tonemap(ExposureBias*inColor);
vec3 whiteScale = 1 / Uncharted2Tonemap(vec3(tW));
vec3 whiteScale = 1. / Uncharted2Tonemap(vec3(tW));
vec3 color = curr * whiteScale;
vec3 retColor = pow(color, vec3(1 / 1.2));
vec3 retColor = color;//pow(color, vec3(1 / 1));
qgl_FragData[0].rgb = retColor;
}

View File

@@ -3,5 +3,5 @@
in float w;
void main(void) {
qgl_FragData[0].r = w;
//;qgl_FragData[0].r = w;
}