From 49dce5d191bf8091a1c13226f705232db1af6b3a Mon Sep 17 00:00:00 2001 From: Mario Luzeiro Date: Thu, 29 Sep 2016 18:56:56 +0100 Subject: [PATCH] Improve shadow calculation on Raytracing Makes it not so dark. Speed optimization on post shader calculation. --- .../c3d_render_createscene.cpp | 4 +- .../3d_render_raytracing/cmaterial.cpp | 2 +- 3d-viewer/3d_rendering/cpostshader_ssao.cpp | 48 +++++++++++-------- 3d-viewer/3d_rendering/cpostshader_ssao.h | 3 +- 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp index 9ee0a189e5..d234226af3 100644 --- a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp +++ b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp @@ -244,8 +244,8 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER *aStatusTextReporter ) m_lights.Clear(); // This will work as the front camera light. - const float light_camera_intensity = 0.15f; - const float light_directional_intensity_top = 0.20f; + const float light_camera_intensity = 0.17f; + const float light_directional_intensity_top = 0.15f; const float light_directional_intensity = ( 1.0f - ( light_camera_intensity + light_directional_intensity_top ) ) / 4.0f; diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/cmaterial.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/cmaterial.cpp index cf3890e894..272f15919b 100644 --- a/3d-viewer/3d_rendering/3d_render_raytracing/cmaterial.cpp +++ b/3d-viewer/3d_rendering/3d_render_raytracing/cmaterial.cpp @@ -71,7 +71,7 @@ CMATERIAL::CMATERIAL( const SFVEC3F &aAmbient, // This may be a good value if based on nr of lights // that contribute to the illumination of that point -#define AMBIENT_FACTOR 0.160f +#define AMBIENT_FACTOR (1.0f/6.0f) #define SPECULAR_FACTOR 1.000f // https://en.wikipedia.org/wiki/Blinn%E2%80%93Phong_shading_model diff --git a/3d-viewer/3d_rendering/cpostshader_ssao.cpp b/3d-viewer/3d_rendering/cpostshader_ssao.cpp index 3d86528591..8614776b0e 100644 --- a/3d-viewer/3d_rendering/cpostshader_ssao.cpp +++ b/3d-viewer/3d_rendering/cpostshader_ssao.cpp @@ -44,13 +44,14 @@ float CPOSTSHADER_SSAO::aoFF( const SFVEC2I &aShaderPos, const SFVEC3F &ddiff, const SFVEC3F &cnorm, int c1, - int c2 ) const + int c2, + float aAttShadowFactor ) const { float return_value = -1.0f; const float rd = glm::length( ddiff ); - const float shadow_factor_at_shade_pos = GetShadowFactorAt( aShaderPos ) * 1.00f; + const float shadow_factor_at_shade_pos = aAttShadowFactor * 1.00f; float shadow_factor = shadow_factor_at_shade_pos; @@ -80,17 +81,19 @@ float CPOSTSHADER_SSAO::aoFF( const SFVEC2I &aShaderPos, //shadow_factor = 1.0f / ( shadow_factor * 15.0f + 3.0f ) - 0.05f; // http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIxLjAvKHgqMTUuMCszLjApLTAuMDUiLCJjb2xvciI6IiMwMDAwMDAifSx7InR5cGUiOjEwMDAsIndpbmRvdyI6WyItMC41OTk1NTEyNjc1Njk4MjUiLCIxLjI3Mzk0NjE3NzQxNjI5ODgiLCItMC4xMTQzMjE1NjkyMTMwMTAwOCIsIjEuMDM4NTk5OTM1MzkzODM1MyJdfV0- //shadow_factor = 1.0f / ( shadow_factor * 10.0f + 2.0f ) - 0.08f; // http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIxLjAvKHgqMTAuMCsyLjApLTAuMDgiLCJjb2xvciI6IiMwMDAwMDAifSx7InR5cGUiOjEwMDAsIndpbmRvdyI6WyItMC41OTk1NTEyNjc1Njk4MjUiLCIxLjI3Mzk0NjE3NzQxNjI5ODgiLCItMC4xMTQzMjE1NjkyMTMwMTAwOCIsIjEuMDM4NTk5OTM1MzkzODM1MyJdfV0- //shadow_factor = (1.0f / ( shadow_factor * 3.0f + 1.5f ))- 0.22f; // http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIxLjAvKHgqMy4wKzEuNSktMC4yMiIsImNvbG9yIjoiIzAwMDAwMCJ9LHsidHlwZSI6MTAwMCwid2luZG93IjpbIi0wLjU5OTU1MTI2NzU2OTgyNSIsIjEuMjczOTQ2MTc3NDE2Mjk4OCIsIi0wLjExNDMyMTU2OTIxMzAxMDA4IiwiMS4wMzg1OTk5MzUzOTM4MzUzIl19XQ-- - shadow_factor = (1.0f / ( shadow_factor * 1.7f + 1.9f ))- 0.28f; // http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIoMS4wLyh4KjEuNysxLjkpKS0wLjI4IiwiY29sb3IiOiIjMDAwMDAwIn0seyJ0eXBlIjoxMDAwLCJ3aW5kb3ciOlsiLTAuNTk5NTUxMjY3NTY5ODI1IiwiMS4yNzM5NDYxNzc0MTYyOTg4IiwiLTAuMTE0MzIxNTY5MjEzMDEwMDgiLCIxLjAzODU5OTkzNTM5MzgzNTMiXX1d - //shadow_factor = 0.25f - shadow_factor * 0.25f; - //shadow_factor = (0.7f - shadow_factor * shadow_factor * 1.0f ) / 9.0f; - + //shadow_factor = (1.0f / ( shadow_factor * 1.7f + 1.9f ))- 0.28f; // http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIoMS4wLyh4KjEuNysxLjkpKS0wLjI4IiwiY29sb3IiOiIjMDAwMDAwIn0seyJ0eXBlIjoxMDAwLCJ3aW5kb3ciOlsiLTAuNTk5NTUxMjY3NTY5ODI1IiwiMS4yNzM5NDYxNzc0MTYyOTg4IiwiLTAuMTE0MzIxNTY5MjEzMDEwMDgiLCIxLjAzODU5OTkzNTM5MzgzNTMiXX1d + //shadow_factor = (shadow_factor - 0.1); + //shadow_factor = (1.0f / ( shadow_factor * shadow_factor * 1.7f + 1.1f ))- 0.58f; // http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIoMS4wLygoeC0wLjEpKih4LTAuMSkqMS43KzEuMSkpLTAuNTgiLCJjb2xvciI6IiMwMDAwMDAifSx7InR5cGUiOjEwMDAsIndpbmRvdyI6WyItMC41OTk1NTEyNjc1Njk4MjUiLCIxLjI3Mzk0NjE3NzQxNjI5ODgiLCItMC4xMTQzMjE1NjkyMTMwMTAwOCIsIjEuMDM4NTk5OTM1MzkzODM1MyJdLCJzaXplIjpbNjQ5LDM5OV19XQ-- + //shadow_factor = -shadow_factor * shadow_factor * 0.2f + 0.15f; //http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIoLXgqMC4yKzAuMTUpIiwiY29sb3IiOiIjMDAwMDAwIn0seyJ0eXBlIjoxMDAwLCJ3aW5kb3ciOlsiLTAuNTk5NTUxMjY3NTY5ODI1IiwiMS4yNzM5NDYxNzc0MTYyOTg4IiwiLTAuMTE0MzIxNTY5MjEzMDEwMDgiLCIxLjAzODU5OTkzNTM5MzgzNTMiXSwic2l6ZSI6WzY0OSwzOTldfV0- + shadow_factor = -shadow_factor * shadow_factor * 0.3f + 0.25f; // http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIoLXgqMC4zKzAuMjUpIiwiY29sb3IiOiIjMDAwMDAwIn0seyJ0eXBlIjoxMDAwLCJ3aW5kb3ciOlsiLTAuNTk5NTUxMjY3NTY5ODI1IiwiMS4yNzM5NDYxNzc0MTYyOTg4IiwiLTAuMTE0MzIxNTY5MjEzMDEwMDgiLCIxLjAzODU5OTkzNTM5MzgzNTMiXSwic2l6ZSI6WzY0OSwzOTldfV0- + shadow_factor = glm::max( shadow_factor, -0.06f ); // add some bias // Calculate the edges ambient oclusion // ///////////////////////////////////////////////////////////////////////// //if( (rd > FLT_EPSILON) && (rd < 0.2f) ) // This limit to the zero of the function (see below) //if( rd > FLT_EPSILON ) - if( (rd > FLT_EPSILON) && (rd < 5.0f) ) + if( (rd > FLT_EPSILON) && (rd < 1.0f) ) { const SFVEC3F vv = glm::normalize( ddiff ); @@ -111,9 +114,12 @@ float CPOSTSHADER_SSAO::aoFF( const SFVEC2I &aShaderPos, // http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIwLjgtKHgvKHgvMiswLjE1KSkiLCJjb2xvciI6IiMwMDAwMDAifSx7InR5cGUiOjAsImVxIjoiLXgqMC4wNSswLjI1IiwiY29sb3IiOiIjMDAwMDAwIn0seyJ0eXBlIjoxMDAwLCJ3aW5kb3ciOlsiLTAuMjE1NzI4MDU1ODgzMjU4NjYiLCIyLjEyNjE0Mzc1MDM0OTM4ODciLCItMC4wOTM1NDA0NzY0MjczNjA0MiIsIjEuMzQ3NjExNDA0MzMxMTkyNCJdfV0- // zero: 0.2 - attDistFactor = 0.8f - (rd / (rd / 2.0f + 0.15f)); + // attDistFactor = 0.8f - (rd / (rd / 2.0f + 0.15f)); + // attDistFactor = glm::max( attDistFactor, -rd * 0.05f + 0.25f ); - attDistFactor = glm::max( attDistFactor, -rd * 0.05f + 0.25f ); + // http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiIwLjgtKHgvKHgvMC45MCswLjEzKSkiLCJjb2xvciI6IiMwMDAwMDAifSx7InR5cGUiOjAsImVxIjoiKC14KjAuMiswLjE1KSIsImNvbG9yIjoiIzAwMDAwMCJ9LHsidHlwZSI6MTAwMCwid2luZG93IjpbIi0wLjIxNTcyODA1NTg4MzI1ODY2IiwiMi4xMjYxNDM3NTAzNDkzODg3IiwiLTAuMDkzNTQwNDc2NDI3MzYwNDIiLCIxLjM0NzYxMTQwNDMzMTE5MjQiXSwic2l6ZSI6WzY0OSwzOTldfV0- + // zero: 1.0 + attDistFactor = 0.8f - (rd / (rd / 0.90f + 0.13f)); // Original: @@ -141,7 +147,7 @@ float CPOSTSHADER_SSAO::aoFF( const SFVEC2I &aShaderPos, } // Test / Debug code - //return glm::clamp( return_value, 0.0f, 0.500f ); + //return glm::clamp( return_value, 0.0f, 1.000f ); //return 0.0f; return return_value; } @@ -199,10 +205,12 @@ SFVEC3F CPOSTSHADER_SSAO::Shade( const SFVEC2I &aShaderPos ) const //cdepth = (1.0f / cdepth) * 2.0f; // read current normal,position and color. - const SFVEC3F n = GetNormalAt( aShaderPos ); - const SFVEC3F p = GetPositionAt( aShaderPos ); + const SFVEC3F n = GetNormalAt( aShaderPos ); + const SFVEC3F p = GetPositionAt( aShaderPos ); //const SFVEC3F col = GetColorAt( aShaderPos ); + const float shadowFactor = GetShadowFactorAt( aShaderPos ); + // initialize variables: float ao = 0.0f; SFVEC3F gi = SFVEC3F(0.0f); @@ -231,14 +239,14 @@ SFVEC3F CPOSTSHADER_SSAO::Shade( const SFVEC2I &aShaderPos ) const const SFVEC3F ddiff7 = GetPositionAt( aShaderPos + SFVEC2I( npw, 0 ) ) - p; const SFVEC3F ddiff8 = GetPositionAt( aShaderPos + SFVEC2I(-npw, 0 ) ) - p; - ao+= aoFF( aShaderPos, ddiff , n, npw, nph ); - ao+= aoFF( aShaderPos, ddiff2, n, npw,-nph ); - ao+= aoFF( aShaderPos, ddiff3, n, -npw, nph ); - ao+= aoFF( aShaderPos, ddiff4, n, -npw,-nph ); - ao+= aoFF( aShaderPos, ddiff5, n, 0, nph ); - ao+= aoFF( aShaderPos, ddiff6, n, 0,-nph ); - ao+= aoFF( aShaderPos, ddiff7, n, npw, 0 ); - ao+= aoFF( aShaderPos, ddiff8, n, -npw, 0 ); + ao+= aoFF( aShaderPos, ddiff , n, npw, nph, shadowFactor ); + ao+= aoFF( aShaderPos, ddiff2, n, npw,-nph, shadowFactor ); + ao+= aoFF( aShaderPos, ddiff3, n, -npw, nph, shadowFactor ); + ao+= aoFF( aShaderPos, ddiff4, n, -npw,-nph, shadowFactor ); + ao+= aoFF( aShaderPos, ddiff5, n, 0, nph, shadowFactor ); + ao+= aoFF( aShaderPos, ddiff6, n, 0,-nph, shadowFactor ); + ao+= aoFF( aShaderPos, ddiff7, n, npw, 0, shadowFactor ); + ao+= aoFF( aShaderPos, ddiff8, n, -npw, 0, shadowFactor ); gi+= giFF( aShaderPos, ddiff , n, npw, nph) * giColorCurve( GetColorAt( aShaderPos + SFVEC2I( npw, nph ) ) ); diff --git a/3d-viewer/3d_rendering/cpostshader_ssao.h b/3d-viewer/3d_rendering/cpostshader_ssao.h index 3cc4366753..b5c37c84a6 100644 --- a/3d-viewer/3d_rendering/cpostshader_ssao.h +++ b/3d-viewer/3d_rendering/cpostshader_ssao.h @@ -52,7 +52,8 @@ private: const SFVEC3F &ddiff, const SFVEC3F &cnorm, int c1, - int c2) const; + int c2, + float aAttShadowFactor ) const; float giFF( const SFVEC2I &aShaderPos, const SFVEC3F &ddiff,