2012-01-30 91 views
3

我有一對夫婦用戶在他們的屏幕上報告白色塊,我不確定什麼導致這個問題。它似乎在大多數手機上工作正常,但我不確定問題可能是什麼。 (已知不在Galaxy Nexus和Droid Pro上工作,但在我的原始Droid上運行良好)。我只是難住,下面是我的代碼和用戶發佈的問題的截圖。任何想法可能會造成這種情況?它用ES 1.1編寫。的arent裝載的是被透明感的PNG與借鑑紋理不加載在某些手機上

gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 

enter image description here

代碼:

public class MenuButton { 
    AssetManager assetManager; 
    GL10 gl; 
    // Our vertices. 

    //Our texture. 
    private float texture[] = { 
      //Mapping coordinates for the vertices 
      0.0f, 1.0f, 
      1.0f, 1.0f, 
      0.0f, 0.0f, 
      1.0f, 0.0f, 
    }; 

    // The order we like to connect them. 
    private byte indices[] = {0,1,3,2}; 


    // Our vertex buffer. 
    private FloatBuffer vertexBuffer; 

    // Our index buffer. 
    private ByteBuffer indexBuffer; 

    //texture buffer. 
    private FloatBuffer textureBuffer; 

    //Our texture pointer. 
    private int[] textures = new int[3]; 


    float width; 
    float height; 
    public MenuButton(Bitmap graphic,GL10 _gl, int _width, int _height) { 
     width=_width; 
     height=_height; 

     float vertices[] = { 
       0f, -_width, 0.0f, //LB 
       width, -_width, 0.0f, //RB 
       0, 0, 0.0f, //LT 
       _width, 0.0f, 0.0f, //RT 
      }; 


     gl=_gl; 
     ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4); 
     byteBuf.order(ByteOrder.nativeOrder()); 
     vertexBuffer = byteBuf.asFloatBuffer(); 
     vertexBuffer.put(vertices); 
     vertexBuffer.position(0); 

     // 
     byteBuf = ByteBuffer.allocateDirect(texture.length * 4); 
     byteBuf.order(ByteOrder.nativeOrder()); 
     textureBuffer = byteBuf.asFloatBuffer(); 
     textureBuffer.put(texture); 
     textureBuffer.position(0); 

     // 
     indexBuffer = ByteBuffer.allocateDirect(indices.length); 
     indexBuffer.put(indices); 
     indexBuffer.position(0);  



     loadGLTexture(0, graphic); 

    } 

    /** 
    * This function draws our square on screen. 
    * @param gl 
    */ 
    public void draw(GL10 gl) { 
     //Bind our only previously generated texture in this case 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 

     //Point to our buffers 
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

     //Set the face rotation 
     gl.glFrontFace(GL10.GL_CCW); 

     //Enable the vertex and texture state 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
     gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 

     gl.glEnable(GL10.GL_CULL_FACE); 
     //Draw the vertices as triangles, based on the Index Buffer information 
     gl.glDrawElements(GL10.GL_TRIANGLE_FAN, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer); 

     // Disable the vertices buffer. 
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
     //Disable the texture buffer. 
     gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    } 
    /** 
    * Load the textures 
    * 
    * @param gl - The GL Context 
    * @param context - The Activity context 
    */ 
    public void destroyTexture() { 
     gl.glDeleteTextures(3, textures, 0); 
    } 
    public void loadGLTexture(int graphicsToLoad,Bitmap bitmap) { 


     //Generate three texture pointers... 
     gl.glGenTextures(3, textures, 0); 
     //...and bind it to our array 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 
     //Create Nearest Filtered Texture 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR_MIPMAP_NEAREST); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
     gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_GENERATE_MIPMAP, GL11.GL_TRUE); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
     bitmap.recycle();   
    } 
    public boolean amIHit(float[] matrixValues,MotionEvent event) { 
     Log.e("sys",""+event.getY()); 

//  if (((event.getX())>(0)&&((event.getX()))<5+width)&&((event.getY())>0)&&(event.getY()<width)) { 
     if (((event.getX()>0)&&(event.getX()<5+width))&&((event.getY()>0)&&(event.getY()<5+height))) { 
      Log.e("sys","hit menu button."); 
      return true; 
     } 
     Log.e("sys","menu button not hit."); 
     return false;  
    } 


} 

回答

1

看看這個鏈接,並使用冪的兩個重要尺寸位圖:

http://groups.google.com/group/android-developers/browse_thread/thread/2cb496c5da3b6955?pli=1

也許這是潛在的問題,並且一些平臺(比如你的Droid)更寬容,而其他平臺(比如你的用戶的Galaxy Nexus)則不是。

這裏是另一種可能性:

Android OpenGL ES 1.1 white box textures

您必須啓用頂點數組和紋理COORDS陣列和撥打任何電話到您的glDraw ...()函數之前綁定你 緩存索引。

+0

我一直堅持使用POT紋理,不好更新問題 – jfisk 2012-01-30 06:16:02