diff --git a/data/shaders/passthrough.frag b/data/shaders/passthrough.frag new file mode 100644 index 000000000..5ffb2d22c --- /dev/null +++ b/data/shaders/passthrough.frag @@ -0,0 +1,11 @@ +uniform sampler2D tex; +uniform int width; +uniform int height; + +out vec4 FragColor; + +void main() +{ + vec2 uv = gl_FragCoord.xy / vec2(width, height); + FragColor = texture(tex, uv); +} \ No newline at end of file diff --git a/src/graphics/post_processing.cpp b/src/graphics/post_processing.cpp index 794d95d40..ca7b3e421 100644 --- a/src/graphics/post_processing.cpp +++ b/src/graphics/post_processing.cpp @@ -468,15 +468,10 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &a glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT); } -void PostProcessing::renderPassThrough(GLuint tex) +void PostProcessing::renderPassThrough(GLuint tex, unsigned width, unsigned height) { - glUseProgram(FullScreenShader::PassThroughShader::getInstance()->Program); - glBindVertexArray(FullScreenShader::PassThroughShader::getInstance()->vao); - FullScreenShader::PassThroughShader::getInstance()->SetTextureUnits(tex); - FullScreenShader::PassThroughShader::getInstance()->setUniforms(); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + DrawFullScreenEffect(width, height); } void PostProcessing::renderTextureLayer(unsigned tex, unsigned layer) @@ -728,7 +723,7 @@ FrameBuffer *PostProcessing::render(scene::ICameraSceneNode * const camnode, boo glBlendEquation(GL_FUNC_ADD); in_fbo->Bind(); - renderPassThrough(irr_driver->getRenderTargetTexture(RTT_QUARTER2)); + renderPassThrough(irr_driver->getRenderTargetTexture(RTT_QUARTER2), in_fbo->getWidth(), in_fbo->getHeight()); glDisable(GL_BLEND); } PROFILER_POP_CPU_MARKER(); @@ -762,17 +757,17 @@ FrameBuffer *PostProcessing::render(scene::ICameraSceneNode * const camnode, boo renderGaussian6Blur(irr_driver->getFBO(FBO_BLOOM_128), irr_driver->getFBO(FBO_TMP_128), 1., 1.); glEnable(GL_BLEND); irr_driver->getFBO(FBO_BLOOM_256).Bind(); - renderPassThrough(irr_driver->getFBO(FBO_BLOOM_128).getRTT()[0]); + renderPassThrough(irr_driver->getFBO(FBO_BLOOM_128).getRTT()[0], 256, 256); glDisable(GL_BLEND); renderGaussian6Blur(irr_driver->getFBO(FBO_BLOOM_256), irr_driver->getFBO(FBO_TMP_256), 2., 2.); glEnable(GL_BLEND); irr_driver->getFBO(FBO_BLOOM_512).Bind(); - renderPassThrough(irr_driver->getFBO(FBO_BLOOM_256).getRTT()[0]); + renderPassThrough(irr_driver->getFBO(FBO_BLOOM_256).getRTT()[0], 512, 512); glDisable(GL_BLEND); renderGaussian6Blur(irr_driver->getFBO(FBO_BLOOM_512), irr_driver->getFBO(FBO_TMP_512), 2., 2.); glEnable(GL_BLEND); irr_driver->getFBO(FBO_BLOOM_1024).Bind(); - renderPassThrough(irr_driver->getFBO(FBO_BLOOM_512).getRTT()[0]); + renderPassThrough(irr_driver->getFBO(FBO_BLOOM_512).getRTT()[0], 1024, 1024); glDisable(GL_BLEND); renderGaussian6Blur(irr_driver->getFBO(FBO_BLOOM_1024), irr_driver->getFBO(FBO_TMP_1024), 2., 2.); @@ -828,7 +823,7 @@ FrameBuffer *PostProcessing::render(scene::ICameraSceneNode * const camnode, boo glEnable(GL_FRAMEBUFFER_SRGB); irr_driver->getFBO(FBO_MLAA_COLORS).Bind(); - renderPassThrough(in_fbo->getRTT()[0]); + renderPassThrough(in_fbo->getRTT()[0], irr_driver->getFBO(FBO_MLAA_COLORS).getWidth(), irr_driver->getFBO(FBO_MLAA_COLORS).getHeight()); out_fbo = &irr_driver->getFBO(FBO_MLAA_COLORS); if (UserConfigParams::m_mlaa) // MLAA. Must be the last pp filter. diff --git a/src/graphics/post_processing.hpp b/src/graphics/post_processing.hpp index 8f373d36c..8933ae552 100644 --- a/src/graphics/post_processing.hpp +++ b/src/graphics/post_processing.hpp @@ -91,7 +91,7 @@ public: void renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &auxiliary); /** Render tex. Used for blit/texture resize */ - void renderPassThrough(unsigned tex); + void renderPassThrough(unsigned tex, unsigned width, unsigned height); void renderTextureLayer(unsigned tex, unsigned layer); void applyMLAA(); diff --git a/src/graphics/render.cpp b/src/graphics/render.cpp index 5acdfcaba..3df4ffb43 100644 --- a/src/graphics/render.cpp +++ b/src/graphics/render.cpp @@ -254,13 +254,13 @@ void IrrDriver::renderGLSL(float dt) { glBindFramebuffer(GL_FRAMEBUFFER, 0); glViewport(viewport.UpperLeftCorner.X, viewport.UpperLeftCorner.Y, viewport.LowerRightCorner.X, viewport.LowerRightCorner.Y); - m_post_processing->renderPassThrough(m_rtts->getFBO(FBO_HALF1_R).getRTT()[0]); + m_post_processing->renderPassThrough(m_rtts->getFBO(FBO_HALF1_R).getRTT()[0], viewport.LowerRightCorner.X, viewport.LowerRightCorner.Y); } else if (irr_driver->getRSM()) { glBindFramebuffer(GL_FRAMEBUFFER, 0); glViewport(viewport.UpperLeftCorner.X, viewport.UpperLeftCorner.Y, viewport.LowerRightCorner.X, viewport.LowerRightCorner.Y); - m_post_processing->renderPassThrough(m_rtts->getRSM().getRTT()[0]); + m_post_processing->renderPassThrough(m_rtts->getRSM().getRTT()[0], viewport.LowerRightCorner.X, viewport.LowerRightCorner.Y); } else if (irr_driver->getShadowViz()) { @@ -272,7 +272,7 @@ void IrrDriver::renderGLSL(float dt) glBindFramebuffer(GL_FRAMEBUFFER, 0); if (CVS->isDefferedEnabled()) camera->activate(); - m_post_processing->renderPassThrough(fbo->getRTT()[0]); + m_post_processing->renderPassThrough(fbo->getRTT()[0], viewport.LowerRightCorner.X, viewport.LowerRightCorner.Y); glDisable(GL_FRAMEBUFFER_SRGB); } } diff --git a/src/graphics/render_geometry.cpp b/src/graphics/render_geometry.cpp index 3a822a7e1..727c251c3 100644 --- a/src/graphics/render_geometry.cpp +++ b/src/graphics/render_geometry.cpp @@ -883,7 +883,7 @@ void IrrDriver::renderTransparent() irr_driver->getFBO(FBO_COLORS).Bind(); glStencilFunc(GL_EQUAL, 1, 0xFF); - m_post_processing->renderPassThrough(m_rtts->getRenderTarget(RTT_DISPLACE)); + m_post_processing->renderPassThrough(m_rtts->getRenderTarget(RTT_DISPLACE), irr_driver->getFBO(FBO_COLORS).getWidth(), irr_driver->getFBO(FBO_COLORS).getHeight()); glDisable(GL_STENCIL_TEST); } diff --git a/src/graphics/render_lighting.cpp b/src/graphics/render_lighting.cpp index 0996d9867..cf74eea07 100644 --- a/src/graphics/render_lighting.cpp +++ b/src/graphics/render_lighting.cpp @@ -289,5 +289,5 @@ void IrrDriver::renderLightsScatter(unsigned pointlightcount) glDisable(GL_DEPTH_TEST); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); getFBO(FBO_COLORS).Bind(); - m_post_processing->renderPassThrough(getRenderTargetTexture(RTT_HALF1)); + m_post_processing->renderPassThrough(getRenderTargetTexture(RTT_HALF1), getFBO(FBO_COLORS).getWidth(), getFBO(FBO_COLORS).getHeight()); } diff --git a/src/graphics/shaders.cpp b/src/graphics/shaders.cpp index f4a5168d3..a5c5e6b57 100644 --- a/src/graphics/shaders.cpp +++ b/src/graphics/shaders.cpp @@ -1875,11 +1875,10 @@ namespace FullScreenShader { Program = LoadProgram(OBJECT, GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(), - GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/texturedquad.frag").c_str()); + GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/passthrough.frag").c_str()); - AssignUniforms(); + AssignUniforms("width", "height"); AssignSamplerNames(Program, 0, "tex"); - vao = createVAO(Program); } LayerPassThroughShader::LayerPassThroughShader() diff --git a/src/graphics/shaders.hpp b/src/graphics/shaders.hpp index 44005f700..231a74ae5 100644 --- a/src/graphics/shaders.hpp +++ b/src/graphics/shaders.hpp @@ -557,11 +557,9 @@ public: Gaussian3VBlurShader(); }; -class PassThroughShader : public ShaderHelperSingleton, public TextureRead +class PassThroughShader : public ShaderHelperSingleton, public TextureRead { public: - GLuint vao; - PassThroughShader(); };