user583713
user583713

Reputation: 47

can't get texture to work

I get a white square box and not the texture I what on the screen. Oh I do not think this would matter but just in case I put a linearlayout view first then the surfaceview.

Here my code:

public class GameEngine {

    private float vertices[];
    private float textureUV[];

    private int[] textureId = new int[1];

    private FloatBuffer vertextBuffer;
    private FloatBuffer textureBuffer;

    private short indices[] = {0,1,2,2,1,3};
    private ShortBuffer indexBuffer;

    private float x, y, z;
    private float rot, rotX, rotY, rotZ; 


    public GameEngine() {

    }

    public void setEngine(float x, float y, float vertices[]){
        this.x = x;
        this.y = y;
        this.vertices = vertices;

        ByteBuffer vbb = ByteBuffer.allocateDirect(this.vertices.length * 4);
        vbb.order(ByteOrder.nativeOrder());

        vertextBuffer = vbb.asFloatBuffer();
        vertextBuffer.put(this.vertices);
        vertextBuffer.position(0);
        vertextBuffer.clear();


        ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
        ibb.order(ByteOrder.nativeOrder());

        indexBuffer = ibb.asShortBuffer();
        indexBuffer.put(indices);
        indexBuffer.position(0);
        indexBuffer.clear();
    }



    public void draw(GL10 gl){
        gl.glLoadIdentity();
        gl.glTranslatef(x, y, z);
        gl.glRotatef(rot, rotX, rotY, rotZ);

        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId[0]);

        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);


        gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertextBuffer);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);



        gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_SHORT, indexBuffer);


        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    }

    public void LoadTexture(float textureUV[], GL10 gl, InputStream is) throws IOException{

        this.textureUV = textureUV;

        ByteBuffer tbb = ByteBuffer.allocateDirect(this.textureUV.length * 4);
        tbb.order(ByteOrder.nativeOrder());
        textureBuffer = tbb.asFloatBuffer();
        textureBuffer.put(this.textureUV);
        textureBuffer.position(0);
        textureBuffer.clear();

        Bitmap bitmap = null;

        try{
            bitmap = BitmapFactory.decodeStream(is);

        }finally{
            try{
                is.close();
                is = null;
                gl.glGenTextures(1, textureId,0);   
                gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId[0]);


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

                //Use the Android GLUtils to specify a two-dimensional texture image from our bitmap
                GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);


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

                //Clean up
                gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId[0]);

                bitmap.recycle();
            }catch(IOException e){

            }

        }

    }



    public void setVector(float x, float y, float z){
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public void setRot(float rot, float x, float y, float z){
        this.rot = rot;
        this.rotX = x;
        this.rotY = y;
        this.rotZ = z;
    }

    public float getZ(){
        return z;
    }
}

Upvotes: 1

Views: 135

Answers (1)

Tim
Tim

Reputation: 35943

Make sure your texture is a power-of-two size. You can't use NPO2 textures with GL_REPEAT.

Also I don't see glEnable(GL_TEXTURE_2D) anywhere.

Upvotes: 4

Related Questions