Use direct gl calls for ppdisplace.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@15028 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
vincentlj
2014-01-12 23:43:00 +00:00
parent 98f58d257c
commit 47d7f4fdd4
2 changed files with 69 additions and 4 deletions

View File

@@ -4,9 +4,11 @@ uniform sampler2D dtex;
uniform int viz;
in vec2 uv;
void main()
{
vec2 tc = gl_TexCoord[0].xy;
vec2 tc = uv;
vec4 shiftval = texture2D(dtex, tc) / vec4(50.0);
vec2 shift;

View File

@@ -297,6 +297,36 @@ namespace BloomBlendShader
}
}
namespace PPDisplaceShader
{
GLuint Program = 0;
GLuint attrib_position, attrib_texcoord;
GLuint uniform_tex, uniform_dtex, uniform_viz;
GLuint vao = 0;
void init()
{
initGL();
Program = LoadProgram(file_manager->getAsset("shaders/screenquad.vert").c_str(), file_manager->getAsset("shaders/ppdisplace.frag").c_str());
attrib_position = glGetAttribLocation(Program, "Position");
attrib_texcoord = glGetAttribLocation(Program, "Texcoord");
uniform_tex = glGetUniformLocation(Program, "tex");
uniform_dtex = glGetUniformLocation(Program, "dtex");
uniform_viz = glGetUniformLocation(Program, "viz");
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);
}
}
static
void renderBloom(ITexture *in)
@@ -344,6 +374,37 @@ void renderBloomBlend(ITexture *in)
glDisable(GL_BLEND);
}
static
void renderPPDisplace(ITexture *in)
{
if (!PPDisplaceShader::Program)
PPDisplaceShader::init();
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE);
glDisable(GL_DEPTH_TEST);
glUseProgram(PPDisplaceShader::Program);
glBindVertexArray(PPDisplaceShader::vao);
glUniform1i(PPDisplaceShader::uniform_viz, irr_driver->getDistortViz());
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, static_cast<irr::video::COpenGLTexture*>(in)->getOpenGLTextureName());
glUniform1i(PPDisplaceShader::uniform_tex, 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, static_cast<irr::video::COpenGLTexture*>(irr_driver->getRTT(RTT_DISPLACE))->getOpenGLTextureName());
glUniform1i(PPDisplaceShader::uniform_dtex, 1);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
}
// ----------------------------------------------------------------------------
/** Render the post-processed scene */
void PostProcessing::render()
@@ -661,7 +722,9 @@ void PostProcessing::render()
if (irr_driver->getDisplacingNodes().size()) // Displacement
{
m_material.MaterialType = irr_driver->getShader(ES_PPDISPLACE);
drv->setRenderTarget(out, true, false);
renderPPDisplace(in);
/* m_material.MaterialType = irr_driver->getShader(ES_PPDISPLACE);
m_material.setFlag(EMF_BILINEAR_FILTER, false);
m_material.setTexture(0, in);
m_material.setTexture(1, irr_driver->getRTT(RTT_DISPLACE));
@@ -670,7 +733,7 @@ void PostProcessing::render()
drawQuad(cam, m_material);
m_material.setTexture(1, 0);
m_material.setFlag(EMF_BILINEAR_FILTER, true);
m_material.setFlag(EMF_BILINEAR_FILTER, true);*/
ITexture *tmp = in;
in = out;
@@ -747,7 +810,7 @@ void PostProcessing::render()
} else if (irr_driver->getShadowViz())
{
m_material.MaterialType = irr_driver->getShader(ES_FLIP);
m_material.setTexture(0, irr_driver->getRTT(RTT_SHADOW));
m_material.setTexture(0, irr_driver->getRTT(RTT_DISPLACE));
} else
{
m_material.MaterialType = irr_driver->getShader(ES_COLOR_LEVELS);