From d105a2a8a129c06e30bab7c6c42e34552c6f853a Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Thu, 14 May 2015 20:26:08 +0600 Subject: [PATCH] Make PostProcessor GLES2 compatible. --- src/PostProcessor.cpp | 30 ++++++++++++++++++++++++++++++ src/PostProcessor.h | 3 ++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/PostProcessor.cpp b/src/PostProcessor.cpp index a6e3ad95..6a960352 100644 --- a/src/PostProcessor.cpp +++ b/src/PostProcessor.cpp @@ -24,6 +24,18 @@ SHADER_VERSION "} \n" ; +static const char* copyShader = +SHADER_VERSION +"in mediump vec2 vTexCoord; \n" +"uniform sampler2D Sample0; \n" +"out lowp vec4 fragColor; \n" +" \n" +"void main() \n" +"{ \n" +" fragColor = texture2D(Sample0, vTexCoord); \n" +"} \n" +; + static const char* extractBloomShader = SHADER_VERSION "in mediump vec2 vTexCoord; \n" @@ -250,6 +262,14 @@ void PostProcessor::init() assert(loc >= 0); glUniform1i(loc, config.bloomFilter.thresholdLevel); +#ifdef GLES2 + m_copyProgram = _createShaderProgram(vertexShader, copyShader); + glUseProgram(m_copyProgram); + loc = glGetUniformLocation(m_copyProgram, "Sample0"); + assert(loc >= 0); + glUniform1i(loc, 0); +#endif + m_seperableBlurProgram = _createShaderProgram(vertexShader, seperableBlurShader); glUseProgram(m_seperableBlurProgram); loc = glGetUniformLocation(m_seperableBlurProgram, "Sample0"); @@ -295,6 +315,9 @@ void PostProcessor::init() void PostProcessor::destroy() { + if (m_copyProgram != 0) + glDeleteProgram(m_copyProgram); + m_copyProgram = 0; if (m_extractBloomProgram != 0) glDeleteProgram(m_extractBloomProgram); m_extractBloomProgram = 0; @@ -372,6 +395,12 @@ void PostProcessor::process(FrameBuffer * _pBuffer) _setGLState(); OGLVideo & ogl = video(); +#ifdef GLES2 + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO_original); + textureCache().activateTexture(0, _pBuffer->m_pTexture); + glUseProgram(m_copyProgram); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); +#else glBindFramebuffer(GL_READ_FRAMEBUFFER, _pBuffer->m_FBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO_original); glBlitFramebuffer( @@ -379,6 +408,7 @@ void PostProcessor::process(FrameBuffer * _pBuffer) 0, 0, ogl.getWidth(), ogl.getHeight(), GL_COLOR_BUFFER_BIT, GL_LINEAR ); +#endif glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); diff --git a/src/PostProcessor.h b/src/PostProcessor.h index 446f4f0f..130b1b20 100644 --- a/src/PostProcessor.h +++ b/src/PostProcessor.h @@ -16,7 +16,7 @@ public: private: PostProcessor() : - m_extractBloomProgram(0), m_seperableBlurProgram(0), m_glowProgram(0), m_bloomProgram(0), + m_extractBloomProgram(0), m_seperableBlurProgram(0), m_glowProgram(0), m_bloomProgram(0), m_copyProgram(0), m_FBO_original(0), m_FBO_glowMap(0), m_FBO_blur(0), m_pTextureOriginal(NULL), m_pTextureGlowMap(NULL), m_pTextureBlur(NULL) {} PostProcessor(const PostProcessor & _other); @@ -25,6 +25,7 @@ private: GLuint m_seperableBlurProgram; GLuint m_glowProgram; GLuint m_bloomProgram; + GLuint m_copyProgram; GLuint m_FBO_original; GLuint m_FBO_glowMap;