текстурите не се зареждат на определени телефони

Няколко потребители съобщиха за бели блокове на екраните си и не съм сигурен какво причинява този проблем. Изглежда, че работи добре на повечето телефони, но не съм сигурен какъв може да е проблемът. (известно е, че не работи на Galaxy Nexus и Droid Pro, но работи добре на моя оригинален Droid). Просто съм объркан, по-долу е моят код и екранна снимка, публикувана от потребителя за проблема. Някаква идея на какво може да се дължи това? Написано е в ES 1.1. Тези, които не се зареждат, са png с прозрачни, с които се рисува

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

въведете описание на изображението тук

код:

 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;       
    }


}

person jfisk    schedule 30.01.2012    source източник


Отговори (1)


Обърнете внимание на тази връзка и важността на използването на растерни изображения с мощност от две:

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

Може би това е основният проблем и някои платформи (като вашия Droid) са по-прощаващи, а други платформи (като Galaxy Nexus на вашия потребител) не са.

Ето още една възможност:

Текстури на бяла кутия на Android OpenGL ES 1.1

Трябва да активирате масива от върхове и масива от координати на текстури и да обвържете вашите буферни индекси, преди да направите каквото и да е извикване на вашата функция glDraw...().

person paulsm4    schedule 30.01.2012