git-svn-id: svn://db.shs.com.ru/libs@60 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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_);
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
in float w;
|
||||
|
||||
void main(void) {
|
||||
qgl_FragData[0].r = w;
|
||||
//;qgl_FragData[0].r = w;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user