In my experience, the classic cause of "white" textures on some hardware but
not other is a non-power-of-two texture.  Your code doesn't seem to enforce
POT texture dimensions, are your assets POT?

On Mon, Oct 3, 2011 at 5:43 PM, saex <elpablos...@gmail.com> wrote:

> i have an app that draws a square on the screen with a texture, and
> the user can rotate the square touching the screen. It works fine with
> android 1.5 to 2.1. But when i test the App on a Motorola Droid with
> android 2.2.2 something is failing because the square is loaded with a
> white texture.
>
> What is wrong?
>
> This is the code of my class square:
>
>    public class Square {
>
>        /** The buffer holding the vertices */
>        private FloatBuffer vertexBuffer;
>        /** The buffer holding the texture coordinates */
>        private FloatBuffer textureBuffer;
>        /** Our texture pointer */
>        private int[] textures = new int[3];
>
>        /** The initial vertex definition */
>        private float vertices[] = {
>                                                -1.0f, -1.0f, 0.0f,
> //Bottom Left
>                                                1.0f, -1.0f, 0.0f,
>    //Bottom Right
>                                                -1.0f, 1.0f, 0.0f,
>    //Top Left
>                                                1.0f, 1.0f, 0.0f
>    //Top Right
>
>    };
>        /** The initial texture coordinates (u, v) */
>
>        private float texture[] = {
>                                        //Mapping coordinates for the
> vertices
>                                        0.0f, 0.0f,
>                                        0.0f, 1.0f,
>                                        1.0f, 0.0f,
>                                        1.0f, 1.0f
>                                        };
>
>        /**
>         * The Square constructor.
>         *
>         * Initiate the buffers.
>         */
>        public Square() {
>                //
>                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);
>        }
>
>        /**
>         * The object own drawing function.
>         * Called from the renderer to redraw this instance
>         * with possible changes in values.
>         *
>         * @param gl - The GL Context
>         */
>        public void draw(GL10 gl) {
>                //Set the face rotation
>                //gl.glFrontFace(GL10.GL_CW);
>                gl.glFrontFace(GL10.GL_CCW);
>                //Bind our only previously generated texture in this case
>                gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
>                //Point to our vertex buffer
>                gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
>                gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
>                //Enable vertex buffer
>                gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
>                gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
>                //Set The Color To Blue
>                //gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);
>                //Draw the vertices as triangle strip
>                gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length /
> 3);
>                //Disable the client state before leaving
>                gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
>                gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
>
>                ///
>                //Bind the texture according to the set texture filter
>                //gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[filter]);
>        }
>
>        /**
>         * Load the textures
>         *
>         * @param gl - The GL Context
>         * @param context - The Activity context
>         */
>        public void loadGLTexture(GL10 gl, Context context) {
>                //Generate one texture pointer...
>                gl.glGenTextures(1, 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_NEAREST);
>                gl.glTexParameterf(GL10.GL_TEXTURE_2D,
> GL10.GL_TEXTURE_MAG_FILTER,
> GL10.GL_LINEAR);
>
>                //Different possible texture parameters, e.g.
> GL10.GL_CLAMP_TO_EDGE
>                gl.glTexParameterf(GL10.GL_TEXTURE_2D,
> GL10.GL_TEXTURE_WRAP_S,
> GL10.GL_REPEAT);
>                gl.glTexParameterf(GL10.GL_TEXTURE_2D,
> GL10.GL_TEXTURE_WRAP_T,
> GL10.GL_REPEAT);
>
>                //Get the texture from the Android resource directory
>                InputStream is =
> context.getResources().openRawResource(R.drawable.radiocd2);
>                Bitmap bitmap = null;
>                try {
>                        //BitmapFactory is an Android graphics utility for
> images
>                        bitmap = BitmapFactory.decodeStream(is);
>
>                } finally {
>                        //Always clear and close
>                        try {
>                                is.close();
>                                is = null;
>                        } catch (IOException e) {
>                        }
>                }
>
>                //Use the Android GLUtils to specify a two-dimensional
> texture image
> from our bitmap
>                GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
>
>                /*
>                 * This is a change to the original tutorial, as buildMipMap
> does
> not exist anymore
>                 * in the Android SDK.
>                 *
>                 * We check if the GL context is version 1.1 and generate
> MipMaps by
> flag.
>                 * Otherwise we call our own buildMipMap implementation
>                 */
>                if(gl instanceof GL11) {
>                        gl.glTexParameterf(GL11.GL_TEXTURE_2D,
> GL11.GL_GENERATE_MIPMAP,
> GL11.GL_TRUE);
>                        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap,
> 0);
>
>                //
>                } else {
>                        buildMipmap(gl, bitmap);
>                }
>
>                //Clean up
>                bitmap.recycle();
>        }
>
>        /**
>         * Our own MipMap generation implementation.
>         * Scale the original bitmap down, always by factor two,
>         * and set it as new mipmap level.
>         *
>         * Thanks to Mike Miller (with minor changes)!
>         *
>         * @param gl - The GL Context
>         * @param bitmap - The bitmap to mipmap
>         */
>        private void buildMipmap(GL10 gl, Bitmap bitmap) {
>                //
>                int level = 0;
>                //
>                int height = bitmap.getHeight();
>                int width = bitmap.getWidth();
>
>                //
>                while(height >= 1 || width >= 1) {
>                        //First of all, generate the texture from our bitmap
> and set it to
> the according level
>                        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, level,
> bitmap, 0);
>
>                        //
>                        if(height == 1 || width == 1) {
>                                break;
>                        }
>
>                        //Increase the mipmap level
>                        level++;
>
>                        //
>                        height /= 2;
>                        width /= 2;
>                        Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap,
> width, height,
> true);
>
>                        //Clean up
>                        bitmap.recycle();
>                        bitmap = bitmap2;
>                }
>        }
>    }
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to android-developers@googlegroups.com
> To unsubscribe from this group, send email to
> android-developers+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to