s3db: disable postprocess mode

- seems old mali having issues with dependent texture reads..
- add bypass shader for testing
This commit is contained in:
Hannes Janetzek 2014-05-04 22:25:31 +02:00
parent e7a015a1d7
commit a8662d4dce
4 changed files with 89 additions and 25 deletions

View File

@ -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;
}

View File

@ -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);
}
}
}

View File

@ -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 {

View File

@ -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);