Make SSAO param changeable.
This commit is contained in:
parent
41cca2e56e
commit
496269e73b
@ -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
|
||||
|
||||
|
@ -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<irr::scene::IAnimatedMeshSceneNode*> 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(); }
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -729,16 +729,13 @@ public:
|
||||
static void init();
|
||||
};
|
||||
|
||||
class SSAOShader
|
||||
class SSAOShader : public ShaderHelperSingleton<SSAOShader, float, float, float>
|
||||
{
|
||||
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
|
||||
|
@ -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")
|
||||
|
Loading…
x
Reference in New Issue
Block a user