纹理没有在某些手机上加载

时间:2012-01-30 06:05:59

标签: android opengl-es opengl-es-1.1

我的屏幕上有几个用户报告白色块,我不确定是什么导致了这个问题。它似乎在大多数手机上工作正常,但我不确定问题是什么。 (已知不在Galaxy Nexus和Droid Pro上工作,但在我原来的Droid上工作正常)。我只是难倒,下面是我的代码和用户发布的问题截图。知道是什么原因引起的吗?它用ES 1.1编写。没有加载的是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 个答案:

答案 0 :(得分: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 ...()函数进行任何调用之前缓冲索引。