текстуры не загружаются на определенных телефонах - PullRequest
3 голосов
/ 30 января 2012

У меня было несколько пользовательских отчетов белых блоков на их экранах, и я не уверен, что вызвало эту проблему. Кажется, он работает нормально на большинстве телефонов, но я не уверен, в чем проблема. (известно, что он не работает на Galaxy Nexus и Droid Pro, но отлично работает на моем оригинальном Droid). Я просто озадачен, ниже мой код и скриншот, опубликованный пользователем этой проблемы. Есть идеи, что может быть причиной этого? Это написано в ES 1.1. Те, которые не загружаются, - это pngs с прозрачным рисованием с

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 Ответ

1 голос
/ 30 января 2012

Взгляните на эту ссылку и важность использования растровых изображений с двойным размером:

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

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

Вот еще одна возможность:

Текстуры белой коробки Android OpenGL ES 1.1

Вы должны включить массив вершин и массив текстурных координат и связать свой буферные индексы перед выполнением любых вызовов вашей функции glDraw ... ().

...