title: Android - OpenGL - Emulator vs Actual Device
body: <p>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..</p>
  
  <pre><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, 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();
  }
  </code></pre>
  
  <p>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..</p>
  
  <p>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?</p>