Use direct call for some gaussian3blur invokation.
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@15050 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
@@ -455,6 +455,35 @@ namespace Gaussian6HBlurShader
|
||||
}
|
||||
}
|
||||
|
||||
namespace Gaussian3HBlurShader
|
||||
{
|
||||
GLuint Program = 0;
|
||||
GLuint attrib_position, attrib_texcoord;
|
||||
GLuint uniform_tex, uniform_pixel;
|
||||
|
||||
GLuint vao = 0;
|
||||
|
||||
void init()
|
||||
{
|
||||
initGL();
|
||||
Program = LoadProgram(file_manager->getAsset("shaders/screenquad.vert").c_str(), file_manager->getAsset("shaders/gaussian3h.frag").c_str());
|
||||
attrib_position = glGetAttribLocation(Program, "Position");
|
||||
attrib_texcoord = glGetAttribLocation(Program, "Texcoord");
|
||||
uniform_tex = glGetUniformLocation(Program, "tex");
|
||||
uniform_pixel = glGetUniformLocation(Program, "pixel");
|
||||
if (!quad_vbo)
|
||||
initQuadVBO();
|
||||
glGenVertexArrays(1, &vao);
|
||||
glBindVertexArray(vao);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, quad_vbo);
|
||||
glEnableVertexAttribArray(attrib_position);
|
||||
glEnableVertexAttribArray(attrib_texcoord);
|
||||
glVertexAttribPointer(attrib_position, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
|
||||
glVertexAttribPointer(attrib_texcoord, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (GLvoid*)(2 * sizeof(float)));
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
}
|
||||
|
||||
namespace Gaussian6VBlurShader
|
||||
{
|
||||
GLuint Program = 0;
|
||||
@@ -484,6 +513,35 @@ namespace Gaussian6VBlurShader
|
||||
}
|
||||
}
|
||||
|
||||
namespace Gaussian3VBlurShader
|
||||
{
|
||||
GLuint Program = 0;
|
||||
GLuint attrib_position, attrib_texcoord;
|
||||
GLuint uniform_tex, uniform_pixel;
|
||||
|
||||
GLuint vao = 0;
|
||||
|
||||
void init()
|
||||
{
|
||||
initGL();
|
||||
Program = LoadProgram(file_manager->getAsset("shaders/screenquad.vert").c_str(), file_manager->getAsset("shaders/gaussian3v.frag").c_str());
|
||||
attrib_position = glGetAttribLocation(Program, "Position");
|
||||
attrib_texcoord = glGetAttribLocation(Program, "Texcoord");
|
||||
uniform_tex = glGetUniformLocation(Program, "tex");
|
||||
uniform_pixel = glGetUniformLocation(Program, "pixel");
|
||||
if (!quad_vbo)
|
||||
initQuadVBO();
|
||||
glGenVertexArrays(1, &vao);
|
||||
glBindVertexArray(vao);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, quad_vbo);
|
||||
glEnableVertexAttribArray(attrib_position);
|
||||
glEnableVertexAttribArray(attrib_texcoord);
|
||||
glVertexAttribPointer(attrib_position, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
|
||||
glVertexAttribPointer(attrib_texcoord, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (GLvoid*)(2 * sizeof(float)));
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
}
|
||||
|
||||
namespace PassThroughShader
|
||||
{
|
||||
GLuint Program = 0;
|
||||
@@ -691,6 +749,47 @@ void PostProcessing::renderLightbBlend(ITexture *diffuse, ITexture *specular, IT
|
||||
glDisable(GL_BLEND);
|
||||
}
|
||||
|
||||
|
||||
void PostProcessing::renderGaussian3Blur(video::ITexture *in, video::ITexture *temprtt, float inv_width, float inv_height)
|
||||
{
|
||||
glDisable(GL_BLEND);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
{
|
||||
if (!Gaussian3VBlurShader::Program)
|
||||
Gaussian3VBlurShader::init();
|
||||
irr_driver->getVideoDriver()->setRenderTarget(temprtt, false, false);
|
||||
glUseProgram(Gaussian3VBlurShader::Program);
|
||||
glBindVertexArray(Gaussian3VBlurShader::vao);
|
||||
|
||||
glUniform2f(Gaussian3VBlurShader::uniform_pixel, inv_width, inv_height);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, static_cast<irr::video::COpenGLTexture*>(in)->getOpenGLTextureName());
|
||||
glUniform1i(Gaussian3VBlurShader::uniform_tex, 0);
|
||||
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
}
|
||||
{
|
||||
if (!Gaussian3HBlurShader::Program)
|
||||
Gaussian3HBlurShader::init();
|
||||
irr_driver->getVideoDriver()->setRenderTarget(in, false, false);
|
||||
glUseProgram(Gaussian3HBlurShader::Program);
|
||||
glBindVertexArray(Gaussian3HBlurShader::vao);
|
||||
|
||||
glUniform2f(Gaussian3HBlurShader::uniform_pixel, inv_width, inv_height);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, static_cast<irr::video::COpenGLTexture*>(temprtt)->getOpenGLTextureName());
|
||||
glUniform1i(Gaussian3HBlurShader::uniform_tex, 0);
|
||||
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
}
|
||||
glBindVertexArray(0);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
void PostProcessing::renderGaussian6Blur(video::ITexture *in, video::ITexture *temprtt, float inv_width, float inv_height)
|
||||
{
|
||||
glDisable(GL_BLEND);
|
||||
@@ -955,21 +1054,7 @@ void PostProcessing::render()
|
||||
drawQuad(cam, m_material);
|
||||
|
||||
// Blur
|
||||
{
|
||||
gacb->setResolution(UserConfigParams::m_width / 4,
|
||||
UserConfigParams::m_height / 4);
|
||||
m_material.MaterialType = irr_driver->getShader(ES_GAUSSIAN3V);
|
||||
m_material.setTexture(0, irr_driver->getRTT(RTT_QUARTER1));
|
||||
drv->setRenderTarget(irr_driver->getRTT(RTT_QUARTER2), true, false);
|
||||
|
||||
drawQuad(cam, m_material);
|
||||
|
||||
m_material.MaterialType = irr_driver->getShader(ES_GAUSSIAN3H);
|
||||
m_material.setTexture(0, irr_driver->getRTT(RTT_QUARTER2));
|
||||
drv->setRenderTarget(irr_driver->getRTT(RTT_QUARTER1), false, false);
|
||||
|
||||
drawQuad(cam, m_material);
|
||||
}
|
||||
renderGaussian3Blur(irr_driver->getRTT(RTT_QUARTER1), irr_driver->getRTT(RTT_QUARTER2), 4. / UserConfigParams::m_width, 4.f / UserConfigParams::m_height);
|
||||
|
||||
// Calculate the sun's position in texcoords
|
||||
const core::vector3df pos = sun->getPosition();
|
||||
|
||||
@@ -82,6 +82,7 @@ public:
|
||||
void renderLightbBlend(video::ITexture *diffuse, video::ITexture *specular, video::ITexture *ao, video::ITexture *specmap, bool debug);
|
||||
|
||||
/** Blur the in texture */
|
||||
void renderGaussian3Blur(video::ITexture *in, video::ITexture *temprtt, float inv_width, float inv_height);
|
||||
void renderGaussian6Blur(video::ITexture *in, video::ITexture *temprtt, float inv_width, float inv_height);
|
||||
|
||||
/** Render tex. Used for blit/texture resize */
|
||||
|
||||
@@ -755,8 +755,6 @@ void IrrDriver::renderLights(const core::aabbox3df& cambox,
|
||||
m_post_processing->renderPointlight(irr_driver->getRTT(RTT_NORMAL_AND_DEPTH) , accumulatedLightPos, accumulatedLightColor, accumulatedLightEnergy);
|
||||
// Handle SSAO
|
||||
SMaterial m_material;
|
||||
GaussianBlurProvider * const gacb = (GaussianBlurProvider *) irr_driver->
|
||||
getCallback(ES_GAUSSIAN3H);
|
||||
|
||||
m_material.ZWriteEnable = false;
|
||||
m_material.MaterialType = irr_driver->getShader(ES_SSAO);
|
||||
@@ -768,19 +766,9 @@ void IrrDriver::renderLights(const core::aabbox3df& cambox,
|
||||
m_post_processing->drawQuad(cam, m_material);
|
||||
|
||||
// Blur it to reduce noise.
|
||||
if(UserConfigParams::m_ssao == 1) {
|
||||
gacb->setResolution(UserConfigParams::m_width / 4,
|
||||
UserConfigParams::m_height / 4);
|
||||
m_material.MaterialType = irr_driver->getShader(ES_GAUSSIAN3V);
|
||||
m_material.setTexture(0, irr_driver->getRTT(RTT_SSAO));
|
||||
m_video_driver->setRenderTarget(irr_driver->getRTT(RTT_QUARTER4), true, false);
|
||||
m_post_processing->drawQuad(cam, m_material);
|
||||
|
||||
m_material.MaterialType = irr_driver->getShader(ES_GAUSSIAN3H);
|
||||
m_material.setTexture(0, irr_driver->getRTT(RTT_QUARTER4));
|
||||
m_video_driver->setRenderTarget(irr_driver->getRTT(RTT_SSAO), false, false);
|
||||
m_post_processing->drawQuad(cam, m_material);
|
||||
} else if (UserConfigParams::m_ssao == 2)
|
||||
if(UserConfigParams::m_ssao == 1)
|
||||
m_post_processing->renderGaussian3Blur(irr_driver->getRTT(RTT_SSAO), irr_driver->getRTT(RTT_QUARTER4), 4.f / UserConfigParams::m_width, 4.f / UserConfigParams::m_height);
|
||||
else if (UserConfigParams::m_ssao == 2)
|
||||
m_post_processing->renderGaussian6Blur(irr_driver->getRTT(RTT_SSAO), irr_driver->getRTT(RTT_TMP4), 1.f / UserConfigParams::m_width, 1.f / UserConfigParams::m_height);
|
||||
|
||||
m_video_driver->setRenderTarget(m_rtts->getRTT(RTT_COLOR), false, false);
|
||||
@@ -837,19 +825,7 @@ void IrrDriver::renderDisplacement(video::SOverrideMaterial &overridemat,
|
||||
minimat.TextureLayer[0].TextureWrapU =
|
||||
minimat.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE;
|
||||
|
||||
((GaussianBlurProvider *) m_shaders->m_callbacks[ES_GAUSSIAN3H])->setResolution(
|
||||
UserConfigParams::m_width,
|
||||
UserConfigParams::m_height);
|
||||
|
||||
minimat.MaterialType = m_shaders->getShader(ES_GAUSSIAN3H);
|
||||
minimat.setTexture(0, m_rtts->getRTT(RTT_DISPLACE));
|
||||
m_video_driver->setRenderTarget(m_rtts->getRTT(RTT_TMP2), true, false);
|
||||
m_post_processing->drawQuad(cam, minimat);
|
||||
|
||||
minimat.MaterialType = m_shaders->getShader(ES_GAUSSIAN3V);
|
||||
minimat.setTexture(0, m_rtts->getRTT(RTT_TMP2));
|
||||
m_video_driver->setRenderTarget(m_rtts->getRTT(RTT_DISPLACE), true, false);
|
||||
m_post_processing->drawQuad(cam, minimat);
|
||||
m_post_processing->renderGaussian3Blur(m_rtts->getRTT(RTT_DISPLACE), m_rtts->getRTT(RTT_TMP2), 1.f / UserConfigParams::m_width, 1.f / UserConfigParams::m_height);
|
||||
|
||||
glDisable(GL_STENCIL_TEST);
|
||||
m_video_driver->setRenderTarget(m_rtts->getRTT(RTT_COLOR), false, false);
|
||||
|
||||
Reference in New Issue
Block a user