diff --git a/data/shaders/ssao.frag b/data/shaders/ssao.frag index 2e551ddb4..dc4b44347 100644 --- a/data/shaders/ssao.frag +++ b/data/shaders/ssao.frag @@ -2,15 +2,14 @@ // and improvements here http://graphics.cs.williams.edu/papers/SAOHPG12/ uniform sampler2D dtex; -uniform vec4 samplePoints[16]; +uniform float radius = 1.; +uniform float k = 1.5; +uniform float sigma = 1.; out float AO; -const float sigma = 1.; const float tau = 7.; const float beta = 0.002; const float epsilon = .00001; -const float radius = 1.; -const float k = 1.5; #define SAMPLES 16 diff --git a/src/graphics/irr_driver.hpp b/src/graphics/irr_driver.hpp index 3f40ccd14..3c96f0caa 100644 --- a/src/graphics/irr_driver.hpp +++ b/src/graphics/irr_driver.hpp @@ -344,6 +344,10 @@ private: STKRenderingPass m_phase; + float m_ssao_radius; + float m_ssao_k; + float m_ssao_sigma; + #ifdef DEBUG /** Used to visualise skeletons. */ std::vector m_debug_meshes; @@ -678,6 +682,36 @@ public: const core::matrix4 &getProjViewMatrix() const { return m_ProjViewMatrix; } const core::matrix4 &getInvProjViewMatrix() const { return m_InvProjViewMatrix; } const core::vector2df &getCurrentScreenSize() const { return m_current_screen_size; } + // ------------------------------------------------------------------------ + float getSSAORadius() const + { + return m_ssao_radius; + } + + void setSSAORadius(float v) + { + m_ssao_radius = v; + } + + float getSSAOK() const + { + return m_ssao_k; + } + + void setSSAOK(float v) + { + m_ssao_k = v; + } + + float getSSAOSigma() const + { + return m_ssao_sigma; + } + + void setSSAOSigma(float v) + { + m_ssao_sigma = v; + } #ifdef DEBUG /** Removes debug meshes. */ void clearDebugMesh() { m_debug_meshes.clear(); } diff --git a/src/graphics/post_processing.cpp b/src/graphics/post_processing.cpp index 4e3a6eedc..3ae8af717 100644 --- a/src/graphics/post_processing.cpp +++ b/src/graphics/post_processing.cpp @@ -525,16 +525,13 @@ void PostProcessing::renderSSAO() if (!noise_tex) noise_tex = irr_driver->getTexture(file_manager->getAsset("textures/noise.png").c_str()); - glUseProgram(FullScreenShader::SSAOShader::Program); - glBindVertexArray(FullScreenShader::SSAOShader::vao); + glUseProgram(FullScreenShader::SSAOShader::getInstance()->Program); + glBindVertexArray(FullScreenShader::SSAOShader::getInstance()->vao); - setTexture(0, irr_driver->getRenderTargetTexture(RTT_LINEAR_DEPTH), GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST); + setTexture(FullScreenShader::SSAOShader::getInstance()->TU_dtex, irr_driver->getRenderTargetTexture(RTT_LINEAR_DEPTH), GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST); glGenerateMipmap(GL_TEXTURE_2D); - setTexture(1, getTextureGLuint(noise_tex), GL_LINEAR, GL_LINEAR); - FullScreenShader::SSAOShader::setUniforms(core::vector2df(float(UserConfigParams::m_width), - float(UserConfigParams::m_height)), - 0, 1); + FullScreenShader::SSAOShader::getInstance()->setUniforms(irr_driver->getSSAORadius(), irr_driver->getSSAOK(), irr_driver->getSSAOSigma()); glDrawArrays(GL_TRIANGLES, 0, 3); } diff --git a/src/graphics/shaders.cpp b/src/graphics/shaders.cpp index a44122feb..34422cf79 100644 --- a/src/graphics/shaders.cpp +++ b/src/graphics/shaders.cpp @@ -389,7 +389,6 @@ void Shaders::loadShaders() FullScreenShader::PassThroughShader::init(); FullScreenShader::LayerPassThroughShader::init(); FullScreenShader::LinearizeDepthShader::init(); - FullScreenShader::SSAOShader::init(); FullScreenShader::DiffuseEnvMapShader::init(); FullScreenShader::RadianceHintsConstructionShader::init(); FullScreenShader::RHDebug::init(); @@ -1996,152 +1995,20 @@ namespace FullScreenShader vao = createVAO(Program); } - GLuint SSAOShader::Program; - GLuint SSAOShader::uniform_ntex; - GLuint SSAOShader::uniform_dtex; - GLuint SSAOShader::uniform_noise_texture; - GLuint SSAOShader::uniform_samplePoints; - GLuint SSAOShader::vao; - float SSAOShader::SSAOSamples[64]; - - void SSAOShader::init() + SSAOShader::SSAOShader() { Program = LoadProgram( GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/decodeNormal.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/utils/getPosFromUVDepth.frag").c_str(), GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/ssao.frag").c_str()); - uniform_ntex = glGetUniformLocation(Program, "ntex"); - uniform_dtex = glGetUniformLocation(Program, "dtex"); - uniform_noise_texture = glGetUniformLocation(Program, "noise_texture"); - uniform_samplePoints = glGetUniformLocation(Program, "samplePoints[0]"); + TU_dtex = 0; + AssignTextureUnit(Program, TexUnit(TU_dtex, "dtex")); + AssignUniforms("radius", "k", "sigma"); vao = createFullScreenVAO(Program); GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData"); glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); - - // SSAOSamples[4 * i] and SSAOSamples[4 * i + 1] can be negative - - SSAOSamples[0] = 0.135061f; - SSAOSamples[1] = 0.207948f; - SSAOSamples[2] = 0.968770f; - SSAOSamples[3] = 0.983032f; - - SSAOSamples[4] = 0.273456f; - SSAOSamples[5] = -0.805390f; - SSAOSamples[6] = 0.525898f; - SSAOSamples[7] = 0.942808f; - - SSAOSamples[8] = 0.443450f; - SSAOSamples[9] = -0.803786f; - SSAOSamples[10] = 0.396585f; - SSAOSamples[11] = 0.007996f; - - SSAOSamples[12] = 0.742420f; - SSAOSamples[13] = -0.620072f; - SSAOSamples[14] = 0.253621f; - SSAOSamples[15] = 0.284829f; - - SSAOSamples[16] = 0.892464f; - SSAOSamples[17] = 0.046221f; - SSAOSamples[18] = 0.448744f; - SSAOSamples[19] = 0.753655f; - - SSAOSamples[20] = 0.830350f; - SSAOSamples[21] = -0.043593f; - SSAOSamples[22] = 0.555535f; - SSAOSamples[23] = 0.357463f; - - SSAOSamples[24] = -0.600612f; - SSAOSamples[25] = -0.536421f; - SSAOSamples[26] = 0.592889f; - SSAOSamples[27] = 0.670583f; - - SSAOSamples[28] = -0.280658f; - SSAOSamples[29] = 0.674894f; - SSAOSamples[30] = 0.682458f; - SSAOSamples[31] = 0.553362f; - - SSAOSamples[32] = -0.654493f; - SSAOSamples[33] = -0.140866f; - SSAOSamples[34] = 0.742830f; - SSAOSamples[35] = 0.699820f; - - SSAOSamples[36] = 0.114730f; - SSAOSamples[37] = 0.873130f; - SSAOSamples[38] = 0.473794f; - SSAOSamples[39] = 0.483901f; - - SSAOSamples[40] = 0.699167f; - SSAOSamples[41] = 0.632210f; - SSAOSamples[42] = 0.333879f; - SSAOSamples[43] = 0.010956f; - - SSAOSamples[44] = 0.904603f; - SSAOSamples[45] = 0.393410f; - SSAOSamples[46] = 0.164080f; - SSAOSamples[47] = 0.780297f; - - SSAOSamples[48] = 0.631662f; - SSAOSamples[49] = -0.405195f; - SSAOSamples[50] = 0.660924f; - SSAOSamples[51] = 0.865596f; - - SSAOSamples[52] = -0.195668f; - SSAOSamples[53] = 0.629185f; - SSAOSamples[54] = 0.752223f; - SSAOSamples[55] = 0.019013f; - - SSAOSamples[56] = -0.511316f; - SSAOSamples[57] = 0.635504f; - SSAOSamples[58] = 0.578524f; - SSAOSamples[59] = 0.605457f; - - SSAOSamples[60] = -0.898843f; - SSAOSamples[61] = 0.067382f; - SSAOSamples[62] = 0.433061f; - SSAOSamples[63] = 0.772942f; - - // Generate another random distribution, if needed - /* for (unsigned i = 0; i < 16; i++) { - // Use double to avoid denorm and get a true uniform distribution - // Generate z component between [0.1; 1] to avoid being too close from surface - double z = rand(); - z /= RAND_MAX; - z = 0.1 + 0.9 * z; - - // Now generate x,y on the unit circle - double x = rand(); - x /= RAND_MAX; - x = 2 * x - 1; - double y = rand(); - y /= RAND_MAX; - y = 2 * y - 1; - double xynorm = sqrt(x * x + y * y); - x /= xynorm; - y /= xynorm; - // Now resize x,y so that norm(x,y,z) is one - x *= sqrt(1. - z * z); - y *= sqrt(1. - z * z); - - // Norm factor - double w = rand(); - w /= RAND_MAX; - SSAOSamples[4 * i] = (float)x; - SSAOSamples[4 * i + 1] = (float)y; - SSAOSamples[4 * i + 2] = (float)z; - SSAOSamples[4 * i + 3] = (float)w; - }*/ - } - - void SSAOShader::setUniforms(const core::vector2df &screen, unsigned TU_dtex, unsigned TU_noise) - { - if (irr_driver->needUBOWorkaround()) - bypassUBO(Program); - glUniform4fv(uniform_samplePoints, 16, SSAOSamples); - - glUniform1i(uniform_dtex, TU_dtex); - glUniform1i(uniform_noise_texture, TU_noise); } GLuint FogShader::Program; diff --git a/src/graphics/shaders.hpp b/src/graphics/shaders.hpp index 5763e057e..491ab2f38 100644 --- a/src/graphics/shaders.hpp +++ b/src/graphics/shaders.hpp @@ -729,16 +729,13 @@ public: static void init(); }; -class SSAOShader +class SSAOShader : public ShaderHelperSingleton { public: - static GLuint Program; - static GLuint uniform_ntex, uniform_dtex, uniform_noise_texture, uniform_samplePoints; - static GLuint vao; - static float SSAOSamples[64]; - - static void init(); - static void setUniforms(const core::vector2df &screen, unsigned TU_dtex, unsigned TU_noise); + GLuint TU_dtex; + GLuint vao; + + SSAOShader(); }; class FogShader diff --git a/src/tracks/track.cpp b/src/tracks/track.cpp index 8c8aa64dc..4cbc4040f 100644 --- a/src/tracks/track.cpp +++ b/src/tracks/track.cpp @@ -445,6 +445,9 @@ void Track::loadTrackInfo() m_sun_specular_color = video::SColor(255, 255, 255, 255); m_sun_diffuse_color = video::SColor(255, 255, 255, 255); m_sun_position = core::vector3df(0, 0, 0); + irr_driver->setSSAORadius(1.); + irr_driver->setSSAOK(1.5); + irr_driver->setSSAOSigma(1.); XMLNode *root = file_manager->createXMLTree(m_filename); if(!root || root->getName()!="track")