From 5ca76b651b5025b2ef6a9a6f0478e1736e53294f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Mon, 30 Nov 2015 21:45:46 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@53 a8b55f48-bf90-11e4-a774-851b48703e85 --- qglview/glrendererbase.cpp | 20 +++++++++++++++----- qglview/glrendererbase.h | 2 +- qglview/glshaders.cpp | 2 +- qglview/renderer_deferred_shading.cpp | 13 +++++++++---- qglview/renderer_deferred_shading.h | 1 + qglview/shaders/dsl_pass_1.frag | 6 +++++- qglview/shaders/shadow.frag | 6 ++++-- qglview/shaders/shadow.vert | 9 ++++++--- 8 files changed, 42 insertions(+), 17 deletions(-) diff --git a/qglview/glrendererbase.cpp b/qglview/glrendererbase.cpp index 0571481..0a7fe15 100644 --- a/qglview/glrendererbase.cpp +++ b/qglview/glrendererbase.cpp @@ -229,18 +229,22 @@ void GLRendererBase::renderSingleObject(GLObjectBase & o, RenderingParameters & } -void GLRendererBase::renderShadow(Light * l) { +void GLRendererBase::renderShadow(Light * l, QGLShaderProgram * prog, QMatrix4x4 mat) { Camera cam; QVector3D wp = l->worldPos(); cam.setPos(wp); - cam.setAim(wp + (l->worldTransform() * QVector4D(l->direction, 0).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.apply(1.); RenderingParameters rpl; rpl.pass = GLObjectBase::Solid; - rpl.shaders = 0; + rpl.shaders = prog; 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); //glPushMatrix(); renderSingleShadow(view.objects_, rpl); //glPopMatrix(); @@ -251,11 +255,17 @@ void GLRendererBase::renderSingleShadow(GLObjectBase & o, RenderingParameters & if (!o.isInit()) o.init(); if (!o.visible_) return; - setGLMatrix(rpl.view_matrix * o.itransform_); + if (rpl.shaders) { + //qDebug() << o.name() << curview << curview.determinant(); + setUniformMatrices((QGLShaderProgram*)rpl.shaders, rpl.proj_matrix, rpl.view_matrix * o.itransform_); + } else { + glMatrixMode(GL_MODELVIEW); + setGLMatrix(rpl.view_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_); glPointSize(o.line_width > 0. ? o.line_width : view.lineWidth_); - o.draw(0, true); + o.draw((QGLShaderProgram*)rpl.shaders, true); foreach (GLObjectBase * i, o.children_) renderSingleShadow(*i, rpl); } diff --git a/qglview/glrendererbase.h b/qglview/glrendererbase.h index f740164..203bbb5 100644 --- a/qglview/glrendererbase.h +++ b/qglview/glrendererbase.h @@ -64,7 +64,7 @@ protected: inline void applyFilteringParameters(); void renderObjects(int pass, int light_pass, void * shaders = 0, bool textures = true, bool light = true, bool fog = true); void renderSingleObject(GLObjectBase & o, RenderingParameters & rpl); - void renderShadow(Light * l); + void renderShadow(Light * l, QGLShaderProgram * prog = 0, QMatrix4x4 mat = QMatrix4x4()); void renderSingleShadow(GLObjectBase & o, RenderingParameters & rpl); RenderingParameters rp; diff --git a/qglview/glshaders.cpp b/qglview/glshaders.cpp index 7caf54b..8517db2 100644 --- a/qglview/glshaders.cpp +++ b/qglview/glshaders.cpp @@ -65,7 +65,7 @@ const char qgl_structs[] = " float constantAttenuation;\n" " float linearAttenuation;\n" " float quadraticAttenuation;\n" - " sampler2DShadow shadow;\n" + " sampler2D shadow;\n" " mat4 shadowMatrix;\n" "};\n" "struct QGLMap {\n" diff --git a/qglview/renderer_deferred_shading.cpp b/qglview/renderer_deferred_shading.cpp index 139d90c..8a37a9f 100644 --- a/qglview/renderer_deferred_shading.cpp +++ b/qglview/renderer_deferred_shading.cpp @@ -30,7 +30,8 @@ fbo_g(5, true, GL_RGBA16F), fbo_out(3, false, GL_RGB16F), fbo_hsmall(1, false, G << ShaderPair("bloom_pass_0", &shader_bloom_0) << ShaderPair("bloom_pass_1", &shader_bloom_1) << ShaderPair("fbo_add", &shader_fbo_add) - << ShaderPair("motion_blur", &shader_motion_blur); + << ShaderPair("motion_blur", &shader_motion_blur) + << ShaderPair("shadow", &shader_shadow); for (int i = 0; i < shaders.size(); ++i) *(shaders[i].second) = 0; lights_per_pass = 2; @@ -63,6 +64,7 @@ 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; rp.prev_proj_matrix = prev_proj; rp.prev_view_matrix = prev_view; corner_dirs[0] = (QVector4D(-1, -1, 1, 1) * rp.viewproj_matrix).normalized(); @@ -104,6 +106,7 @@ void RendererDeferredShading::renderScene() { //glReleaseShaders(); fbo_g.release(); + shader_shadow->bind(); if (view.isFeatureEnabled(QGLView::qglShadowsEnabled)) { int sms = view.feature(QGLView::qglShadowsMapSize).toInt(); glDisable(GL_TEXTURE_1D); @@ -123,8 +126,10 @@ void RendererDeferredShading::renderScene() { if (l->light_type == Light::Omni) continue; l->shadow_map.resize(sms, sms); l->shadow_map.bind(); - glClear(GL_DEPTH_BUFFER_BIT); - renderShadow(l); + l->shadow_map.setWriteBuffer(0); + glClearFramebuffer(); + //glClear(GL_DEPTH_BUFFER_BIT); + renderShadow(l, shader_shadow, mprojviewi); l->shadow_map.release(); } } @@ -360,7 +365,7 @@ 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.depthTexture()); + glBindTexture(GL_TEXTURE_2D, lv.back()->shadow_map.colorTexture()); } amb_light.setName("null"); for (int i = light_end; i < lmax; ++i) diff --git a/qglview/renderer_deferred_shading.h b/qglview/renderer_deferred_shading.h index c33264c..7525811 100644 --- a/qglview/renderer_deferred_shading.h +++ b/qglview/renderer_deferred_shading.h @@ -47,6 +47,7 @@ private: GLFramebuffer fbo_g, fbo_out, fbo_hsmall; QGLShaderProgram * shader_fxaa, * shader_ds_0, * shader_ds_1, * shader_hdr, * shader_small; QGLShaderProgram * shader_bloom_0, * shader_bloom_1, * shader_motion_blur, * shader_fbo_add; + QGLShaderProgram * shader_shadow; QVector shaders; QMatrix4x4 prev_view, prev_proj; diff --git a/qglview/shaders/dsl_pass_1.frag b/qglview/shaders/dsl_pass_1.frag index dd1a20e..50869d3 100644 --- a/qglview/shaders/dsl_pass_1.frag +++ b/qglview/shaders/dsl_pass_1.frag @@ -92,6 +92,10 @@ 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 = vec3(ldist/1000); - qgl_FragData[0].rgb = vec3(texture(qgl_Light[0].shadow, vec3(qgl_FragTexture.xy, 0.))*1000+0.5); + 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].a = 0.; } diff --git a/qglview/shaders/shadow.frag b/qglview/shaders/shadow.frag index 8e09671..4dcac29 100644 --- a/qglview/shaders/shadow.frag +++ b/qglview/shaders/shadow.frag @@ -1,5 +1,7 @@ -#version 130 +#version 150 + +in vec4 pos; void main(void) { - gl_FragColor.r = 1. / gl_FragCoord.w; + qgl_FragData[0].r = 1. / pos.w; } diff --git a/qglview/shaders/shadow.vert b/qglview/shaders/shadow.vert index f2eecdc..201a90c 100644 --- a/qglview/shaders/shadow.vert +++ b/qglview/shaders/shadow.vert @@ -1,6 +1,9 @@ -#version 130 +#version 150 + +out vec4 pos; void main(void) { - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = ftransform(); + pos = qgl_ftransform(); + qgl_FragTexture = qgl_Texture; + gl_Position = pos; }