diff --git a/src/fgt/decorate_shadow/decorate_shadow.cpp b/src/fgt/decorate_shadow/decorate_shadow.cpp index 51178e59b..9e1e2ed87 100644 --- a/src/fgt/decorate_shadow/decorate_shadow.cpp +++ b/src/fgt/decorate_shadow/decorate_shadow.cpp @@ -85,9 +85,9 @@ bool DecorateShadowPlugin::StartDecorate(QAction* action, MeshModel& m, GLArea* } - /*if(action->text() == ST(DP_SHOW_SSAO)){ + if(action->text() == ST(DP_SHOW_SSAO)){ result = this->_decorator = new SSAO(); - }*/ + } result = this->_decorator->init(); return result; diff --git a/src/fgt/decorate_shadow/decorate_shadow.h b/src/fgt/decorate_shadow/decorate_shadow.h index adb4358a7..2a0e0e030 100644 --- a/src/fgt/decorate_shadow/decorate_shadow.h +++ b/src/fgt/decorate_shadow/decorate_shadow.h @@ -39,7 +39,7 @@ #include "shadow_mapping.h" #include "variance_shadow_mapping.h" #include "variance_shadow_mapping_blur.h" -//#include "ssao.h" +#include "ssao.h" class DecorateShadowPlugin : public QObject, public MeshDecorateInterface { @@ -64,8 +64,8 @@ public: typeList << DP_SHOW_SIMPLE_SHADOW << DP_SHOW_VSM_SHADOW << - DP_SHOW_VSM_SHADOW_BLUR; /*<< - DP_SHOW_SSAO;*/ + DP_SHOW_VSM_SHADOW_BLUR << + DP_SHOW_SSAO; FilterIDType tt; foreach(tt , types()){ diff --git a/src/fgt/decorate_shadow/decorate_shadow.pro b/src/fgt/decorate_shadow/decorate_shadow.pro index 532bc0591..c7560d521 100644 --- a/src/fgt/decorate_shadow/decorate_shadow.pro +++ b/src/fgt/decorate_shadow/decorate_shadow.pro @@ -5,8 +5,8 @@ HEADERS = decorate_shadow.h \ ../../../../vcglib/wrap/gui/trackball.h \ decorate_shader.h \ variance_shadow_mapping.h \ - variance_shadow_mapping_blur.h - #ssao.h + variance_shadow_mapping_blur.h \ + ssao.h SOURCES = decorate_shadow.cpp \ shadow_mapping.cpp \ ../../meshlab/filterparameter.cpp \ @@ -14,6 +14,6 @@ SOURCES = decorate_shadow.cpp \ ../../../../vcglib/wrap/gui/trackball.cpp \ ../../../../vcglib/wrap/gui/trackmode.cpp \ variance_shadow_mapping.cpp \ - variance_shadow_mapping_blur.cpp - #ssao.cpp + variance_shadow_mapping_blur.cpp \ + ssao.cpp TARGET = decorate_shadow diff --git a/src/fgt/decorate_shadow/shader/ssao/blur.frag b/src/fgt/decorate_shadow/shader/ssao/blur.frag index fccc8d621..7bb5f7341 100644 --- a/src/fgt/decorate_shadow/shader/ssao/blur.frag +++ b/src/fgt/decorate_shadow/shader/ssao/blur.frag @@ -1,7 +1,7 @@ uniform sampler2D scene; uniform vec2 scale; void main() { - vec4 color = vec4(vec3(0.0), 1.0); + vec4 color = vec4(vec3(0.0), 0.0); color += texture2D( scene, gl_TexCoord[0].st + vec2( -3.0 * scale.x, -3.0 * scale.y ) ) * 0.015625; color += texture2D( scene, gl_TexCoord[0].st + vec2( -2.0 * scale.x, -2.0 * scale.y ) )*0.09375; @@ -11,7 +11,8 @@ void main() { color += texture2D( scene, gl_TexCoord[0].st + vec2( 2.0 * scale.x, 2.0 * scale.y ) )*0.09375; color += texture2D( scene, gl_TexCoord[0].st + vec2( 3.0 * scale.x, 3.0 * scale.y ) ) * 0.015625; - + if(color.a < 0.5) + discard; //gl_FragColor = color;//vec4(color.xyz, (0.5 - color.x)); if(scale.y == 0.0) gl_FragColor = color;//vec4(color.xyz, 0.5); diff --git a/src/fgt/decorate_shadow/shader/ssao/normalMap.frag b/src/fgt/decorate_shadow/shader/ssao/normalMap.frag index 146d40dd2..82d35698c 100644 --- a/src/fgt/decorate_shadow/shader/ssao/normalMap.frag +++ b/src/fgt/decorate_shadow/shader/ssao/normalMap.frag @@ -1,13 +1,7 @@ varying vec3 normal; -varying vec4 point; -//varying float depth; void main(){ - float depth = point.z;// / point.w; - depth = depth * 0.5 + 0.5; + vec3 n = normalize(normal);// * 0.5 + 0.5; + gl_FragColor = vec4(vec3(n), gl_FragCoord.z); - //gl_FragColor = vec4(normal, 1.0); - //gl_FragColor = vec4(vec3(depth), 1.0); - - gl_FragColor = vec4(vec3(normal), depth); } \ No newline at end of file diff --git a/src/fgt/decorate_shadow/shader/ssao/normalMap.vert b/src/fgt/decorate_shadow/shader/ssao/normalMap.vert index 4e50da551..10937b0a2 100644 --- a/src/fgt/decorate_shadow/shader/ssao/normalMap.vert +++ b/src/fgt/decorate_shadow/shader/ssao/normalMap.vert @@ -1,20 +1,7 @@ -/*uniform float farPlane; -uniform float nearPlane; -uniform float diag;*/ - varying vec3 normal; -varying vec4 point; -//varying float depth; void main(){ - normal = normalize(gl_NormalMatrix * gl_Normal); - + //normal = gl_Normal; + normal = (gl_Normal + 1.0) / 2.0; gl_Position = ftransform(); - point = gl_Position; - - //depth = gl_Position.z; - //depth = (gl_Position.z + nearPlane) / farPlane; - //depth = (gl_Position.z/ farPlane) + nearPlane; - //depth = (gl_Position.z * (nearPlane * farPlane/ nearPlane + farPlane))// + (nearPlane);// + nearPlane); - //depth = gl_Position / diag; } diff --git a/src/fgt/decorate_shadow/shader/ssao/ssao.frag b/src/fgt/decorate_shadow/shader/ssao/ssao.frag index 3b800cc83..8a19bd6f4 100644 --- a/src/fgt/decorate_shadow/shader/ssao/ssao.frag +++ b/src/fgt/decorate_shadow/shader/ssao/ssao.frag @@ -1,23 +1,43 @@ uniform sampler2D rnm; uniform sampler2D normalMap; -varying vec2 uv; +varying vec4 texCoord; -const float totStrength = 1.38; -const float strength = 0.07; +const float totStrength = 5.38; +const float strength = 0.7; const float offset = 18.0; const float falloff = 0.000002; -const float rad = 0.006; -#define SAMPLES 10 // 10 is good -const float invSamples = -1.38/10.0; +const float rad = 0.005; +#define SAMPLES 16 // 10 is good +const float invSamples = -1.38/2.0; void main(void) { + vec4 texCoordPostW = texCoord / texCoord.w; + texCoordPostW = texCoordPostW * 0.5 + 0.5; + vec2 uv = texCoordPostW.xy; // these are the random vectors inside a unit sphere - vec3 pSphere[10] = vec3[](vec3(-0.010735935, 0.01647018, 0.0062425877),vec3(-0.06533369, 0.3647007, -0.13746321),vec3(-0.6539235, -0.016726388, -0.53000957),vec3(0.40958285, 0.0052428036, -0.5591124),vec3(-0.1465366, 0.09899267, 0.15571679),vec3(-0.44122112, -0.5458797, 0.04912532),vec3(0.03755566, -0.10961345, -0.33040273),vec3(0.019100213, 0.29652783, 0.066237666),vec3(0.8765323, 0.011236004, 0.28265962),vec3(0.29264435, -0.40794238, 0.15964167)); + vec3 pSphere[16] = vec3[]( + vec3(-0.010735935, 0.01647018, 0.0062425877), + vec3(-0.06533369, 0.3647007, -0.13746321), + vec3(-0.6539235, -0.016726388, -0.53000957), + vec3(0.40958285, 0.0052428036, -0.5591124), + vec3(-0.1465366, 0.09899267, 0.15571679), + vec3(-0.44122112, -0.5458797, 0.04912532), + vec3(0.03755566, -0.10961345, -0.33040273), + vec3(0.019100213, 0.29652783, 0.066237666), + vec3(0.8765323, 0.011236004, 0.28265962), + vec3(0.29264435, -0.40794238, 0.15964167), + vec3(0.50958289, 0.2424578036, -0.777556324), + vec3(-0.5476366, 0.09554684, 0.157546479), + vec3(0.445354129, -0.54557427, -0.02452532), + vec3(0.274621116, -0.991025345, -0.25477073), + vec3(0.757454103, 0.00575283, -0.2236553), + vec3(0.8325432003, -0.011354804, 0.9564872) + ); // grab a normal for reflecting the sample rays later on - vec3 fres = normalize((texture2D(rnm,uv*offset).xyz*2.0) - vec3(1.0)); + vec3 fres = normalize((texture2D(rnm , uv * offset).xyz * 2.0) - vec3(1.0)); vec4 currentPixelSample = texture2D(normalMap,uv); @@ -51,11 +71,15 @@ void main(void) bl += step(falloff,depthDifference)*(1.0-dot(occluderFragment.xyz,norm))*(1.0-smoothstep(falloff,strength,depthDifference)); } - // output the result - //gl_FragColor.r = 1.0+bl*invSamples; + float ao = 1.0 + totStrength * bl * invSamples; + /*if(ao > 0.7) + discard; + gl_FragColor = vec4(vec3(0.0), 0.7 - ao);*/ - float ao = 1.0+bl*invSamples; - gl_FragColor = vec4(vec3(ao), 1.0); - //gl_FragColor = 1.0; + float alpha = 1.0; + if((norm.x + norm.y + norm.z) == 0.0) + alpha = 0.0; + + gl_FragColor = vec4(vec3(ao), alpha); } \ No newline at end of file diff --git a/src/fgt/decorate_shadow/shader/ssao/ssao.vert b/src/fgt/decorate_shadow/shader/ssao/ssao.vert index f51fa7752..4f0e7dd83 100644 --- a/src/fgt/decorate_shadow/shader/ssao/ssao.vert +++ b/src/fgt/decorate_shadow/shader/ssao/ssao.vert @@ -1,13 +1,14 @@ -uniform mat4 mvpl; - -varying vec2 uv; +//varying vec2 uv; +varying vec4 texCoord; void main(void) { - //gl_Position = ftransform(); - gl_Position = mvpl * gl_Vertex; - gl_Position = sign( gl_Position ); + gl_Position = ftransform(); + texCoord = gl_Position; +// gl_Position = mvpl * gl_Vertex; + //gl_Position = sign( gl_Position ); // Texture coordinate for screen aligned (in correct range): - uv = (vec2( gl_Position.x, gl_Position.y ) + vec2( 1.0 ) ) * 0.5; + // uv = (vec2( gl_Position.x, gl_Position.y ) + vec2( 1.0 ) ) * 0.5; + //uv = vec2( gl_Position.x, gl_Position.y )+ vec2( 1.0 ) * 0.5; } \ No newline at end of file diff --git a/src/fgt/decorate_shadow/ssao.cpp b/src/fgt/decorate_shadow/ssao.cpp index c6b33896c..e3ac6451c 100644 --- a/src/fgt/decorate_shadow/ssao.cpp +++ b/src/fgt/decorate_shadow/ssao.cpp @@ -15,7 +15,7 @@ SSAO::SSAO():DecorateShader() this->_ssaoShaderProgram = 0; this->_blurH = 0; -// this->_blurV = 0; + this->_blurV = 0; this->_blurVert = 0; this->_blurFrag = 0; this->_blurShaderProgram = 0; @@ -49,7 +49,7 @@ SSAO::~SSAO(){ glDeleteTexturesEXT(1, &(this->_ssao)); glDeleteTexturesEXT(1, &(this->_blurH)); - // glDeleteTexturesEXT(1, &(this->_blurV)); + glDeleteTexturesEXT(1, &(this->_blurV)); glDeleteFramebuffersEXT(1, &_fbo); } @@ -79,83 +79,26 @@ void SSAO::runShader(MeshModel& m, GLArea* gla){ /***********************************************************/ //GENERAZIONE SHADOW MAP /***********************************************************/ -// glEnable(GL_POLYGON_OFFSET_FILL); -// glPolygonOffset(1.0, 1.0); -GLfloat g_mModelView[16]; - GLfloat g_mProjection[16]; - vcg::Box3f bb = m.cm.bbox; - vcg::Point3f center; - center = bb.Center(); - - float diag = bb.Diag(); - - vcg::Matrix44f tm = gla->trackball.Matrix(); - - glMatrixMode(GL_PROJECTION); - - glPushMatrix(); - - glLoadIdentity(); - glOrtho(-(diag/2), - diag/2, - -(diag/2), - diag/2, - -(diag/2), - diag/2); - - glGetFloatv(GL_PROJECTION_MATRIX, g_mProjection); - glMatrixMode(GL_MODELVIEW); - - glPushMatrix(); - glLoadIdentity(); - - vcg::Matrix44f rotation; - vcg::Similarityf track = gla->trackball.track; - track.rot.ToMatrix(rotation); - glMultMatrixf(rotation.transpose().V()); - - //traslate the model in the center - glTranslatef(-center[0],-center[1],-center[2]); - glGetFloatv(GL_MODELVIEW_MATRIX, g_mModelView); - this->bind(); glUseProgram(this->_normalMapShaderProgram); - - /*GLuint farLoc = glGetUniformLocation(this->_normalMapShaderProgram, "farPlane"); - glUniform1f(farLoc, gla->farPlane); - - GLuint nearLoc = glGetUniformLocation(this->_normalMapShaderProgram, "nearPlane"); - glUniform1f(nearLoc, gla->nearPlane); - - GLuint diagLoc = glGetUniformLocation(this->_normalMapShaderProgram, "diag"); - glUniform1f(diagLoc, m.cm.bbox.Diag()); -*/ - RenderMode rm = gla->getCurrentRenderMode(); glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); m.Render(rm.drawMode, vcg::GLW::CMNone, vcg::GLW::TMNone); - // glDisable(GL_POLYGON_OFFSET_FILL); - this->printColorMap(this->_normalMap, "_normalMap.png"); + //this->printColorMap(this->_normalMap, "_normalMap.png"); //this->unbind(); glUseProgram(0); - glPopMatrix(); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); + /***********************************************************/ //SSAO PASS /***********************************************************/ - /*GLint depthFuncOld; - glGetIntegerv(GL_DEPTH_FUNC, &depthFuncOld); - glDepthFunc(GL_LEQUAL);*/ - vcg::Matrix44f mvpl = (vcg::Matrix44f(g_mProjection).transpose() * vcg::Matrix44f(g_mModelView).transpose()).transpose(); + //this->unbind(); glUseProgram(this->_ssaoShaderProgram); - GLuint matrixLoc = glGetUniformLocation(this->_ssaoShaderProgram, "mvpl"); - glUniformMatrix4fv(matrixLoc, 1, 0, mvpl.V()); - + /*glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_DEPTH_TEST);*/ glEnable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, this->_noise); @@ -163,6 +106,7 @@ GLfloat g_mModelView[16]; glUniform1i(noiseloc, 0); glActiveTexture(GL_TEXTURE1); + //glBindTexture(GL_TEXTURE_2D, this->_blurV); glBindTexture(GL_TEXTURE_2D, this->_normalMap); GLuint loc = glGetUniformLocation(this->_ssaoShaderProgram, "normalMap"); glUniform1i(loc, 1); @@ -170,12 +114,19 @@ GLfloat g_mModelView[16]; glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - m.Render(rm.drawMode, vcg::GLW::CMNone, vcg::GLW::TMNone); + m.Render(rm.drawMode, rm.colorMode, vcg::GLW::TMNone); - this->printColorMap(this->_ssao, "_ssao1.png"); + + //this->printColorMap(this->_ssao, "_ssao.png"); //this->unbind(); + /*glEnable(GL_DEPTH_TEST); + glDisable(GL_TEXTURE_2D); + glDisable(GL_BLEND); +*/ glUseProgram(0); + + /****************************************************************************************/ // BLURRING /****************************************************************************************/ @@ -193,15 +144,15 @@ GLfloat g_mModelView[16]; glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); - //vcg::Point3f t = track.tra; - //glTranslated(0,0,t[2]); glTranslated(0,0,-1); + /***********************************************************/ //BLURRING horizontal /***********************************************************/ glUseProgram(this->_blurShaderProgram); - GLfloat scale = 1/(this->_texSize * BLUR_COEF);// * SHADOW_COEF); + float blur_coef = 0.8; + GLfloat scale = 1/(this->_texSize * blur_coef);// * SHADOW_COEF); //GLfloat scale = (1/(this->_texSize)) * BLUR_COEF * SHADOW_COEF; GLuint scaleLoc = glGetUniformLocation(this->_blurShaderProgram, "scale"); glUniform2f(scaleLoc, scale, 0.0); @@ -225,23 +176,23 @@ GLfloat g_mModelView[16]; glVertex3f(-this->_texSize/2,this->_texSize/2,0); glEnd(); - this->printColorMap(this->_blurH, "./_blurOrizzontale.png"); - this->unbind(); + //this->printColorMap(this->_blurH, "./_blurOrizzontale.png"); + //this->unbind(); /***********************************************************/ //BLURRING vertical /***********************************************************/ + this->unbind(); glUniform2f(scaleLoc, 0.0, scale); + glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - glDisable(GL_DEPTH_TEST); - glBindTexture(GL_TEXTURE_2D, this->_blurH); loc = glGetUniformLocation(this->_blurShaderProgram, "scene"); glUniform1i(loc, 0); - + /*glDrawBuffer(GL_COLOR_ATTACHMENT3_EXT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);*/ glBegin(GL_QUADS); glTexCoord2d(0,0); glVertex3f(-this->_texSize/2,-this->_texSize/2,0); @@ -253,12 +204,12 @@ GLfloat g_mModelView[16]; glVertex3f(-this->_texSize/2,this->_texSize/2,0); glEnd(); - - //glDepthFunc((GLenum)depthFuncOld); + glUseProgram(0); + //this->printColorMap(this->_blurV, "_blurVericale.png"); + //this->unbind(); + glEnable(GL_DEPTH_TEST); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); - glUseProgram(0); - glPopMatrix(); glMatrixMode(GL_PROJECTION); @@ -268,6 +219,8 @@ GLfloat g_mModelView[16]; // BLURRING END /****************************************************************************************/ + + int error = glGetError(); } @@ -311,7 +264,6 @@ bool SSAO::setup() //attacco al FBO la texture di colore glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, this->_ssao, 0); - //genero la texture di blur orizzontale. glGenTextures(1, &this->_blurH); glBindTexture(GL_TEXTURE_2D, this->_blurH); @@ -326,6 +278,22 @@ bool SSAO::setup() //e la texture per il blur orizzontale glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT2_EXT, GL_TEXTURE_2D, this->_blurH, 0); + //genero la texture di blur verticale. + glGenTextures(1, &this->_blurV); + glBindTexture(GL_TEXTURE_2D, this->_blurV); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F_ARB, this->_texSize, this->_texSize, 0, GL_RGB, GL_FLOAT, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->_texSize, this->_texSize, 0, GL_RGBA, GL_FLOAT, NULL); + //e la texture per il blur orizzontale + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT3_EXT, GL_TEXTURE_2D, this->_blurV, 0); + + + //genero il render buffer per il depth buffer glGenRenderbuffersEXT(1, &(this->_depth)); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, this->_depth); @@ -335,7 +303,7 @@ bool SSAO::setup() glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, this->_depth); //GLenum drawBuffers[] = {this->_normalMap, this->_ssao, this->_blurH}; - GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2}; + GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3}; glDrawBuffersARB(3, drawBuffers); this->loadNoiseTxt(); diff --git a/src/fgt/decorate_shadow/ssao.h b/src/fgt/decorate_shadow/ssao.h index 3fdbd1b91..1307e8a03 100644 --- a/src/fgt/decorate_shadow/ssao.h +++ b/src/fgt/decorate_shadow/ssao.h @@ -58,7 +58,7 @@ private: GLuint _ssao; GLuint _noise; GLuint _blurH; - //GLuint _blurV; + GLuint _blurV; GLuint _depth;