1
\$\begingroup\$

I have written a simple UI which takes an image (256x256) and maps it to a rectangle. This works perfectly on the emulator however on the phone the texture does not show, I see only a white rectangle. This is my code:

public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
    byteBuffer = ByteBuffer.allocateDirect(shape.length * 4);
    byteBuffer.order(ByteOrder.nativeOrder());
    vertexBuffer = byteBuffer.asFloatBuffer();
    vertexBuffer.put(cardshape);
    vertexBuffer.position(0);

    byteBuffer = ByteBuffer.allocateDirect(shape.length * 4);
    byteBuffer.order(ByteOrder.nativeOrder());
    textureBuffer = byteBuffer.asFloatBuffer();
    textureBuffer.put(textureshape);
    textureBuffer.position(0);

    // Set the background color to black ( rgba ).
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    // Enable Smooth Shading, default not really needed.
    gl.glShadeModel(GL10.GL_SMOOTH);
    // Depth buffer setup.
    gl.glClearDepthf(1.0f);
    // Enables depth testing.
    gl.glEnable(GL10.GL_DEPTH_TEST);
    // The type of depth testing to do.
    gl.glDepthFunc(GL10.GL_LEQUAL);
    // Really nice perspective calculations.
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

    gl.glEnable(GL10.GL_TEXTURE_2D);
    loadGLTexture(gl);
}

public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glMatrixMode(GL10.GL_PROJECTION); // Select Projection
    gl.glPushMatrix(); // Push The Matrix
    gl.glLoadIdentity(); // Reset The Matrix
    gl.glOrthof(0f, 480f, 0f, 800f, -1f, 1f);
    gl.glMatrixMode(GL10.GL_MODELVIEW); // Select Modelview Matrix
    gl.glPushMatrix(); // Push The Matrix
    gl.glLoadIdentity(); // Reset The Matrix

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glLoadIdentity();
    gl.glTranslatef(card.x, card.y, 0.0f);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]); //activates texture to be used now
    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}

public void onSurfaceChanged(GL10 gl, int width, int height) {
    // Sets the current view port to the new size.
    gl.glViewport(0, 0, width, height);
    // Select the projection matrix
    gl.glMatrixMode(GL10.GL_PROJECTION);
    // Reset the projection matrix
    gl.glLoadIdentity();
    // Calculate the aspect ratio of the window
    GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f,
            100.0f);
    // Select the modelview matrix
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    // Reset the modelview matrix
    gl.glLoadIdentity();
}

public int[] texture = new int[1];

public void loadGLTexture(GL10 gl) {
    // loading texture
    Bitmap bitmap;
        bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.image);
        // generate one texture pointer
        gl.glGenTextures(0, texture, 0); //adds texture id to texture array
        // ...and bind it to our array
        gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]); //activates texture to be used now
        // create nearest filtered texture
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
        // Use Android GLUtils to specify a two-dimensional texture image from our bitmap
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
        // Clean up
        bitmap.recycle();
}

As per many other similar issues and resolutions on the web i have tried setting the minsdkversion is 3, loading the bitmap via an input stream bitmap = BitmapFactory.decodeStream(is), setting BitmapFactory.Options.inScaled to false, putting the images in the nodpi folder and putting them in the raw folder.. all of which didn't help.

I'm not really sure what else to try..

\$\endgroup\$

1 Answer 1

1
\$\begingroup\$

Well, it happened to me once. It worked fine on the emulator, but on device, it just crashed or showed without texture. Here's the solution on StackOverflow.

Edit:

Well, I just saw your question's about 2D, and you're using Perspective to create your viewport, consider changing it to glOrtho.

Also does your mobile use a PowerVR as GPU (Milestone mobiles, etc.)? Mine was, And I've heard out there that the RGB565 configuration is the problem here. It's a good guess. Try changing it too.

\$\endgroup\$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .