From a8662d4dcefd88b67ffa391de0a13bf8c56b80a3 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek <hannes.janetzek@gmail.com> Date: Sun, 4 May 2014 22:25:31 +0200 Subject: [PATCH] s3db: disable postprocess mode - seems old mali having issues with dependent texture reads.. - add bypass shader for testing --- vtm/resources/assets/shaders/post_bypass.glsl | 28 +++++++++ .../org/oscim/layers/tile/s3db/S3DBLayer.java | 26 ++++++--- .../layers/tile/vector/BuildingLayer.java | 3 +- .../org/oscim/renderer/OffscreenRenderer.java | 57 +++++++++++++------ 4 files changed, 89 insertions(+), 25 deletions(-) create mode 100644 vtm/resources/assets/shaders/post_bypass.glsl diff --git a/vtm/resources/assets/shaders/post_bypass.glsl b/vtm/resources/assets/shaders/post_bypass.glsl new file mode 100644 index 00000000..65162fb7 --- /dev/null +++ b/vtm/resources/assets/shaders/post_bypass.glsl @@ -0,0 +1,28 @@ +#ifdef GLES +precision highp float; +#endif +uniform vec2 u_pixel; +attribute vec4 a_pos; +varying vec2 tex_pos; + +void main() +{ + gl_Position = a_pos; + tex_pos = (a_pos.xy + 1.0) * 0.5; +} + +$$ + +#ifdef GLES +precision highp float; +#endif +uniform sampler2D u_texColor; +uniform vec2 u_pixel; +varying vec2 tex_pos; + +void main(){ + + gl_FragColor = texture2D(u_texColor, tex_pos) * 0.8; +} + + diff --git a/vtm/src/org/oscim/layers/tile/s3db/S3DBLayer.java b/vtm/src/org/oscim/layers/tile/s3db/S3DBLayer.java index df21c952..57bcaba3 100644 --- a/vtm/src/org/oscim/layers/tile/s3db/S3DBLayer.java +++ b/vtm/src/org/oscim/layers/tile/s3db/S3DBLayer.java @@ -8,6 +8,7 @@ import org.oscim.map.Map; import org.oscim.renderer.ExtrusionRenderer; import org.oscim.renderer.GLViewport; import org.oscim.renderer.OffscreenRenderer; +import org.oscim.renderer.OffscreenRenderer.Mode; import org.oscim.tiling.TileSource; import org.oscim.utils.ColorUtil; import org.oscim.utils.ColorsCSS; @@ -16,6 +17,7 @@ import org.slf4j.LoggerFactory; public class S3DBLayer extends TileLayer { static final Logger log = LoggerFactory.getLogger(S3DBLayer.class); + static final boolean POST_FXAA = false; private final static int MAX_CACHE = 20; private final static int SRC_ZOOM = 16; @@ -46,23 +48,31 @@ public class S3DBLayer extends TileLayer { public S3DBRenderer() { mExtRenderer = new ExtrusionRenderer(this, 16, true, false); - - or = new OffscreenRenderer(); - or.setRenderer(mExtRenderer); + if (POST_FXAA) { + or = new OffscreenRenderer(Mode.FXAA); + or.setRenderer(mExtRenderer); + } } @Override protected synchronized void update(GLViewport v) { super.update(v); - //mExtRenderer.update(v); - or.update(v); - setReady(or.isReady()); + if (POST_FXAA) { + or.update(v); + setReady(or.isReady()); + } else { + mExtRenderer.update(v); + setReady(mExtRenderer.isReady()); + } } @Override protected synchronized void render(GLViewport v) { - or.render(v); - //mExtRenderer.render(v); + if (POST_FXAA) { + or.render(v); + } else { + mExtRenderer.render(v); + } } } diff --git a/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java b/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java index 834b5f27..67a6d875 100644 --- a/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java @@ -26,6 +26,7 @@ import org.oscim.map.Map; import org.oscim.renderer.ExtrusionRenderer; import org.oscim.renderer.GLViewport; import org.oscim.renderer.OffscreenRenderer; +import org.oscim.renderer.OffscreenRenderer.Mode; import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.ExtrusionLayer; import org.oscim.theme.styles.ExtrusionStyle; @@ -100,7 +101,7 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook { }; if (POST_AA) { - OffscreenRenderer or = new OffscreenRenderer(); + OffscreenRenderer or = new OffscreenRenderer(Mode.FXAA); or.setRenderer(mExtRenderer); mRenderer = or; } else { diff --git a/vtm/src/org/oscim/renderer/OffscreenRenderer.java b/vtm/src/org/oscim/renderer/OffscreenRenderer.java index ad1891a9..19a05bf9 100644 --- a/vtm/src/org/oscim/renderer/OffscreenRenderer.java +++ b/vtm/src/org/oscim/renderer/OffscreenRenderer.java @@ -9,6 +9,13 @@ import org.slf4j.LoggerFactory; public class OffscreenRenderer extends LayerRenderer { final static Logger log = LoggerFactory.getLogger(OffscreenRenderer.class); + public enum Mode { + FXAA, + SSAO, + SSAO_FXAA, + BYPASS + } + int fb; int renderTex; int renderDepth; @@ -20,6 +27,7 @@ public class OffscreenRenderer extends LayerRenderer { private float[] mClearColor = { 0, 0, 0, 0 }; private boolean useDepthTexture = false; + private Shader mShader; static class Shader extends GLShader { int aPos, uTexDepth, uTexColor, uPixel; @@ -34,6 +42,12 @@ public class OffscreenRenderer extends LayerRenderer { } } + public final Mode mode; + + public OffscreenRenderer(Mode mode) { + this.mode = mode; + } + protected boolean setupFBO(GLViewport viewport) { IntBuffer buf = MapRenderer.getIntBuffer(1); @@ -54,8 +68,11 @@ public class OffscreenRenderer extends LayerRenderer { // generate color texture GL.glBindTexture(GL20.GL_TEXTURE_2D, renderTex); - GLUtils.setTextureParameter(GL20.GL_NEAREST, - GL20.GL_NEAREST, + GLUtils.setTextureParameter( + GL20.GL_LINEAR, + GL20.GL_LINEAR, + //GL20.GL_NEAREST, + //GL20.GL_NEAREST, GL20.GL_CLAMP_TO_EDGE, GL20.GL_CLAMP_TO_EDGE); @@ -121,13 +138,8 @@ public class OffscreenRenderer extends LayerRenderer { static void init(GL20 gl20) { GL = gl20; - shaders[0] = new Shader("post_fxaa"); - shaders[1] = new Shader("post_ssao"); - shaders[2] = new Shader("post_combined"); } - static Shader[] shaders = new Shader[3]; - public void enable(boolean on) { if (on) GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, fb); @@ -149,9 +161,23 @@ public class OffscreenRenderer extends LayerRenderer { @Override public void update(GLViewport viewport) { - if (texW != viewport.getWidth() || texH != viewport.getHeight()) + if (texW != viewport.getWidth() || texH != viewport.getHeight()) { setupFBO(viewport); - + switch (mode) { + case FXAA: + mShader = new Shader("post_fxaa"); + break; + case SSAO: + mShader = new Shader("post_ssao"); + break; + case SSAO_FXAA: + mShader = new Shader("post_combined"); + break; + case BYPASS: + mShader = new Shader("post_bypass"); + break; + } + } mRenderer.update(viewport); setReady(mRenderer.isReady()); } @@ -168,27 +194,26 @@ public class OffscreenRenderer extends LayerRenderer { GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, 0); - Shader s = shaders[0]; - s.useProgram(); + mShader.useProgram(); /* bind depth texture */ if (useDepthTexture) { GL.glActiveTexture(GL20.GL_TEXTURE1); GLState.bindTex2D(renderDepth); - GL.glUniform1i(s.uTexDepth, 1); + GL.glUniform1i(mShader.uTexDepth, 1); GL.glActiveTexture(GL20.GL_TEXTURE0); } /* bind color texture */ GLState.bindTex2D(renderTex); - GL.glUniform1i(s.uTexColor, 0); + GL.glUniform1i(mShader.uTexColor, 0); - MapRenderer.bindQuadVertexVBO(s.aPos, true); + MapRenderer.bindQuadVertexVBO(mShader.aPos, true); - GL.glUniform2f(s.uPixel, + GL.glUniform2f(mShader.uPixel, (float) (1.0 / texW * 0.5), (float) (1.0 / texH * 0.5)); - GLState.enableVertexArrays(s.aPos, -1); + GLState.enableVertexArrays(mShader.aPos, -1); GLState.test(false, false); GLState.blend(true);