2012-03-12 54 views
3

我在使用紋理地圖集在OpenGL中創建紋理對象時出現問題,我創建了2D遊戲,並且知道如何紋理POT位圖到對象,但是,我似乎無法找到教程在轉換我的代碼使用紋理地圖集出於性能原因,這是我的代碼爲我的當前工作對象創建和紋理實現。在Android中使用紋理地圖集和openGL 1.1的紋理示例

public void createTexture(Bitmap bmp, GL10 gls, int texturename) 
    { 
     this.gl = (GL11) gls; 

     this.TextureName = texturename; 
     bombBmp = bmp; 

     VertexBuffer = null; 
     TextureBuffer = null; 
     IndexBuffer = null; 

     ByteBuffer byteBuffer = ByteBuffer.allocateDirect(12 * 4); 
     byteBuffer.order(ByteOrder.nativeOrder()); 
     VertexBuffer = byteBuffer.asFloatBuffer(); 
     VertexBuffer.put(new float[] { 0, 0, 0.0f, 0, -h, 0.0f, w, 0, 0.0f, w, -h, 0.0f }); 
     VertexBuffer.position(0); 

     byteBuffer = ByteBuffer.allocateDirect(8 * 4); 
     byteBuffer.order(ByteOrder.nativeOrder()); 
     TextureBuffer = byteBuffer.asFloatBuffer(); 
     TextureBuffer.put(new float[] { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f }); 
     TextureBuffer.position(0); 

     byteBuffer = ByteBuffer.allocateDirect(6 * 2); 
     byteBuffer.order(ByteOrder.nativeOrder()); 
     IndexBuffer = byteBuffer.asShortBuffer(); 
     IndexBuffer.put(new short[] { 0, 1, 2, 1, 3, 2 }); 
     IndexBuffer.position(0); 

     gl.glBindTexture(GL10.GL_TEXTURE_2D, this.TextureName); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
     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, bombBmp, 0); 
     bombBmp.recycle(); 
     bombBmp = null; 
    } 

我生成genTexture我Texturename和POT位圖傳遞給這個函數

gl.glGenTextures(1, textures, 0); 
bomb.createTexture(bombBmp, gl, textures[0]); 

這是我應該的紋理位圖

bomb_atlas.png

+1

關於紋理圖集的具體內容你不明白嗎?你知道紋理座標是如何工作的嗎?我不認爲有人會爲你重寫你的代碼,但如果有一些你不明白的特定概念,你可能會找到一些幫助。 – Tim 2012-03-12 06:17:50

+1

我不知道如何綁定紋理圖集的子圖像,我只知道如何將圖像作爲一個整體進行綁定,比如,我必須先使用texImage2d然後使用texSubImage?或者我必須立即使用texSubImage?謝謝 – Keiichi 2012-03-12 07:01:58

+0

你是怎麼解決這個問題的? – hadez30 2014-10-08 11:37:31

回答

1

迴應您的意見,你不」綁定子圖像。 glTexSubImage僅用於替換存儲紋理中的像素。如果你的位圖像已經顯示的那樣已經存在,那麼你只需通過glTexImage2d加載整個紋理並綁定它。

如果您想訪問該圖像的特定部分(比如第一行左邊第三個黃色圓圈彈),那麼您只需修改您用於訪問它的紋理座標。如果該圓圈在自己的圖像中,則只需使用(0,0)到(1,1)座標,但因爲它是另一幅圖像的一部分,所以只能選擇其中的特定部分。在你的照片有它將有texcoords:

(.50,.75) //bottom left 
(.75,.75) //bottom right 
(.75,1.0) //top right 
(.50,1.0) //top left 

如果繪製這些texcoords四看起來應該完全一樣,如果黃圈炸彈有它自己的形象,但你不必守重新綁定紋理所有的時間(因此表現增加)。

+0

感謝您爲我澄清事情,這將幫助我大好時光:) – Keiichi 2012-03-13 03:53:31