2012-01-30 2 views
3

몇 명의 사용자가 화면에 흰색 블록을 신고했으며이 문제를 일으키는 것이 확실하지 않습니다. 그것은 대부분의 휴대 전화에서 잘 작동하는 것 같지만 그 문제가 무엇인지 모릅니다. (갤럭시 넥서스와 드로이드 프로에서 작동하지 않는 것으로 알려져 있지만, 원래의 드로이드에서 잘 작동합니다). 아래의 코드는 사용자가 게시 한 코드와 스크린 샷입니다. 이걸 일으킬 수있는 어떤 생각? 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

당신은 정점 배열 및 텍스처 좌표 배열을 활성화하고 glDraw() 함수를 호출하기하기 전에 당신의 버퍼 인덱스를 바인드해야합니다 : 여기

은 또 다른 가능성이다.

+0

POT 텍스처에 고착되어 질문을 업데이트했습니다. – jfisk

관련 문제