try to fix occasional flickering. only seen on nexus with PowerVR

-> clear stencil region by drawing a quad instead of using glClear(stencil) for each tile
This commit is contained in:
Hannes Janetzek 2013-02-04 17:47:56 +01:00
parent fc96e5f6e8
commit a95e7d6f31
3 changed files with 44 additions and 33 deletions

View File

@ -127,7 +127,6 @@ public class BaseMap {
int simpleShader = (pos.tilt < 1 ? 1 : 0); int simpleShader = (pos.tilt < 1 ? 1 : 0);
for (Layer l = t.layers.layers; l != null;) { for (Layer l = t.layers.layers; l != null;) {
switch (l.type) { switch (l.type) {
case Layer.POLYGON: case Layer.POLYGON:
l = PolygonRenderer.draw(pos, l, mvp, !clipped, true); l = PolygonRenderer.draw(pos, l, mvp, !clipped, true);
@ -145,7 +144,7 @@ public class BaseMap {
} }
} }
//PolygonRenderer.drawOver(mvp); PolygonRenderer.drawOver(mvp);
} }
private static int drawProxyChild(MapTile tile, MapPosition pos) { private static int drawProxyChild(MapTile tile, MapPosition pos) {

View File

@ -239,6 +239,14 @@ public final class PolygonRenderer {
*/ */
static void drawStencilRegion(boolean first) { static void drawStencilRegion(boolean first) {
// if (!first) {
// glStencilMask(0x7F);
// GLES20.glClear(GLES20.GL_STENCIL_BUFFER_BIT);
// // disable drawing to color buffer
// glColorMask(false, false, false, false);
// glStencilFunc(GL_EQUAL, CLIP_BIT, CLIP_BIT);
// }
// disable drawing to color buffer // disable drawing to color buffer
glColorMask(false, false, false, false); glColorMask(false, false, false, false);
@ -247,7 +255,7 @@ public final class PolygonRenderer {
if (first) { if (first) {
// clear previous clip-region from stencil buffer // clear previous clip-region from stencil buffer
GLES20.glClear(GLES20.GL_STENCIL_BUFFER_BIT); //GLES20.glClear(GLES20.GL_STENCIL_BUFFER_BIT);
// Draw clip-region into depth and stencil buffer // Draw clip-region into depth and stencil buffer
// this is used for tile line and polygon layers. // this is used for tile line and polygon layers.
@ -256,7 +264,7 @@ public final class PolygonRenderer {
// draw where no other tile has drawn yet. // draw where no other tile has drawn yet.
GLES20.glEnable(GLES20.GL_POLYGON_OFFSET_FILL); GLES20.glEnable(GLES20.GL_POLYGON_OFFSET_FILL);
// test depth and write to depth buffer // test GL_LESS and write to depth buffer
GLState.test(true, true); GLState.test(true, true);
glDepthMask(true); glDepthMask(true);
@ -286,33 +294,33 @@ public final class PolygonRenderer {
} }
} }
// static void drawOver(float[] matrix) { static void drawOver(float[] matrix) {
// if (GLState.useProgram(polygonProgram)) {
// GLState.useProgram(polygonProgram);
// GLState.enableVertexArrays(hPolygonVertexPosition, -1);
// GLState.enableVertexArrays(hPolygonVertexPosition, -1);
// glVertexAttribPointer(hPolygonVertexPosition, 2, GL_SHORT,
// glVertexAttribPointer(hPolygonVertexPosition, 2, GL_SHORT, false, 0, POLYGON_VERTICES_DATA_POS_OFFSET);
// false, 0, POLYGON_VERTICES_DATA_POS_OFFSET);
// glUniformMatrix4fv(hPolygonMatrix, 1, false, matrix, 0);
// glUniformMatrix4fv(hPolygonMatrix, 1, false, matrix, 0); }
//
// /* clear stencilbuffer (tile region) by drawing /* clear stencilbuffer (tile region) by drawing
// * a quad with func 'always' and op 'zero' */ * a quad with func 'always' and op 'zero' */
//
// // disable drawing to framebuffer (will be re-enabled in fill) // disable drawing to framebuffer (will be re-enabled in fill)
// glColorMask(false, false, false, false); glColorMask(false, false, false, false);
//
// // always pass stencil test: // always pass stencil test:
// glStencilFunc(GL_ALWAYS, 0x00, 0x00); glStencilFunc(GL_ALWAYS, 0x00, 0x00);
// // write to all bits // write to all bits
// glStencilMask(0xFF); glStencilMask(0xFF);
// // zero out area to draw to // zero out area to draw to
// glStencilOp(GLES20.GL_KEEP, GLES20.GL_KEEP, GLES20.GL_ZERO); glStencilOp(GLES20.GL_KEEP, GLES20.GL_KEEP, GLES20.GL_ZERO);
//
// glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
// glColorMask(true, true, true, true); glColorMask(true, true, true, true);
// } }
private static float[] debugFillColor = { 0.3f, 0.0f, 0.0f, 0.3f }; private static float[] debugFillColor = { 0.3f, 0.0f, 0.0f, 0.3f };
private static float[] debugFillColor2 = { .8f, .8f, .8f, .8f }; private static float[] debugFillColor2 = { .8f, .8f, .8f, .8f };

View File

@ -200,9 +200,13 @@ public class GlUtils {
} }
public static void setColor(int handle, float[] c, float alpha) { public static void setColor(int handle, float[] c, float alpha) {
if (alpha >= 1) if (alpha >= 1) {
GLES20.glUniform4fv(handle, 1, c, 0); GLES20.glUniform4fv(handle, 1, c, 0);
else { } else {
if (alpha < 0) {
Log.d(TAG, "setColor: " + alpha);
alpha = 0;
}
tmpColor[0] = c[0] * alpha; tmpColor[0] = c[0] * alpha;
tmpColor[1] = c[1] * alpha; tmpColor[1] = c[1] * alpha;
tmpColor[2] = c[2] * alpha; tmpColor[2] = c[2] * alpha;