Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android - OpenGL - Emulator vs Actual Device

I am writing a game which uses opengles. I have created my renderer class and have a sample of my game working on the emulator, however none of the texures display on an actual device. I have read about the most common cause for this being the need for texture to be a factor of 2 however I have tried drawing a square (128x128) with a texture of the same size mapped to it and this only shows on the emulator. Further to that my actual game will be using rectangles so I'm unsure how I can map textures that are squares to rectangles.. This is my code so far (The game is 2d so I'm using ortho mode): EDIT: I have updated my code, it is now correctly binding textures and using textures of size 128x128, still only seeing textures on the emulator..

    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, card.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();
}

Is there anything I have done wrong? Or something I haven't done? It works perfectly fine in the emulator so I could only assume it was the power of 2 issue but like I said I tried that using a 128x128 texture on a square but it didn't show.. any help would be appreciated..

EDIT: I have also 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 then trying them in the raw folder.. any other ideas?

like image 978
crazyfool Avatar asked Dec 11 '25 02:12

crazyfool


1 Answers

I'm actually looking for the solution to a similar problem right now. I think I might have a temporary fix for you, however.

The problem appears to be that on the emulator the orthographic view is flipped. To solve this, in my app we added an option in preferences to manually flip the view if nothing draws. Here's the snippet that handles this:

if (!flipped)
{
    glOrthof(0, screenWidth, screenHeight, 0, -1, 1); //--Device
}
else
{
    glOrthof(0, screenWidth, 0, -screenHeight, -1, 1); //--Emulator
}

Hope this helps! If anybody has a more general solution, I'd be happy to hear it!

like image 172
gkanwar Avatar answered Dec 12 '25 15:12

gkanwar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!