2012-11-27 38 views
1

我得到一個白色方形框,而不是我在屏幕上的紋理。哦,我不認爲這會很重要,但只是爲了防止我首先放置一個線性佈局視圖,然後再放置表面視圖。不能得到紋理

這裏我的代碼:

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

回答

4

確保你的紋理是電源的一個兩倍大小。您不能在GL_REPEAT中使用NPO2紋理。

我也沒有看到任何地方的glEnable(GL_TEXTURE_2D)

+0

謝謝我總共忘了glEnable(GL_TEXTURE_2D) – user583713