Werner
Werner

Reputation: 769

android opengl es 1.1 - drawing glitch on certain devices - screenshots inside

The top image is the undesired result (it also seems to flicker). The bottom image is what I would like the render to look like on ALL devices.

Glitchy render

Good render

Hello, I seem to be having problems with rendering a textured square to my galaxy s4, but not on my my gt p3113 tablet...

Here is the code from my GLRenderer:

@Override
public void onDrawFrame(GL10 gl)
{
    manObjects.draw(gl, 0, 0);
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height)
{
    if (height == 0)
    { // Prevent A Divide By Zero By
        height = 1; // Making Height Equal One
    }

    gl.glViewport(0, 0, width, height); // Reset The Current Viewport
    gl.glMatrixMode(GL10.GL_PROJECTION); // Select The Projection Matrix
    gl.glLoadIdentity(); // Reset The Projection Matrix

    // respect the height:width ratio of the window.
    GLU.gluOrtho2D(gl, -1f, 1f, 1.6f, -1.6f);

    gl.glMatrixMode(GL10.GL_MODELVIEW); // Select The Modelview Matrix
    gl.glLoadIdentity(); // Reset The Modelview Matrix
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
    // Settings
    gl.glEnable(GL10.GL_TEXTURE_2D); // Enable Texture Mapping
    gl.glShadeModel(GL10.GL_SMOOTH); // Enable Smooth Shading
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
    gl.glClearDepthf(1.0f); // Depth Buffer Setup

    // Really Nice Perspective Calculations
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    gl.glEnable(GL10.GL_BLEND); // Enable blending
    gl.glDisable(GL10.GL_DEPTH_TEST); // Disable depth test
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

    // Load textures
    manObjects.load(gl, mContext);
}

Anyone have any ideas as to why this is happening? And more specifically why it works on one device and not on the other?

Draw code:

public void draw(GL10 gl, float x, float y)
{
    gl.glLoadIdentity();
    gl.glBindTexture(GL10.GL_TEXTURE_2D, texPointers[0]);
    tSquare[0].draw(gl);
}

public void drawBLACK(GL10 gl)
{
    gl.glLoadIdentity();
    gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
    gl.glScalef(1f, 1.6f, 1);
    gl.glColor4f(0, 0, 0, 1);
    tSquare[0].draw(gl);
    gl.glColor4f(1, 1, 1, 1);
}

tSquare[0].draw(gl):

public void draw(GL10 gl)
{
    //Enable the vertex, texture and normal state
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    //Point to our buffers
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

    //Draw the vertices as triangle strip
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);

    //Disable the client state before leaving
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}

Upvotes: 1

Views: 361

Answers (2)

JRowan
JRowan

Reputation: 7104

here is an example of my onDrawFrame, try making your gl calls in onDrawFrame instead

first make

public int width, height;

then

@Override
    public void onSurfaceChanged(GL10 gl, int width, int height) { 
        this.width = width;
        this.height = height;
    }

then onDrawFrame something like this

@Override
public void onDrawFrame(GL10 gl)
{
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glOrthof(0.0f, width, 0.0f, height, -1.0f, 1.0f);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        manObjects.draw(gl, 0, 0);
}

Upvotes: 1

Werner
Werner

Reputation: 769

Possible solution:

I have added another draw before the call that draws the star. This added draw call draws a giant black rectangle that covers the entire screen...

I feel like I'm only masking the problem and not really fixing it... Thoughts?

Upvotes: 0

Related Questions