2010-05-19 104 views
2

嗨,我開發採用了android OpenGL ES的遊戲,並紛紛創出問題:PNG紋理不加載在HTC渴望

我的遊戲加載在模擬器(Windows XP和Vista從日食)的罰款,這也在T-Mobile G2(HTC Hero)上加載效果不錯,但是當我將其加載到我的新HTC Desire上時,沒有任何紋理顯示爲正確加載(或根本不加載)。我懷疑BitmapFactory.decode方法,雖然我沒有證據表明這是問題。

我所有的紋理都是2的冪,JPG紋理似乎加載(雖然它們看起來質量不是很好),但任何GIF或PNG都不會加載,除非加載了2×2的紅色方塊罰款和一個紋理映射到一個3d對象,但似乎用最接近的顏色填充網格的每個三角形)。

這是我加載圖片代碼:

 AssetManager am = androidContext.getAssets(); 
    BufferedInputStream is = null; 
    try { 
    is = new BufferedInputStream(am.open(fileName)); 

    Bitmap bitmap; 

    bitmap = BitmapFactory.decodeStream(is); 

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
    bitmap.recycle(); 
    } catch(IOException e) { 
    Logger.global.log(Level.SEVERE, e.getLocalizedMessage()); 
    } finally { 
    try { 
     is.close(); 
    } catch(Exception e) { 
     // Ignore. 
    } 
    } 

感謝

回答

1

我有同樣的問題。對我而言 - 只有當png具有透明度時纔會發生。 這一切都開始發生時,我升級到2.2。之前進行的紋理做工精細,即使他們是不是2

功率但現在它是完全隨機的。我使用透明背景在GIMP中創建了一個png文件。用刷子畫了一些線條,並在Android應用中顯示黑色。然後我編輯它,再添加3條線,它加載好。然後我做了一些修改,它不會再渲染:S。

我測試了它在一些示例應用程序,以排除我的編碼錯誤(http://insanitydesign.com/wp/projects/nehe-android-ports/ - 混合例子),只是改變了混合功能,我的需求。

它的行爲就像我的應用程序。

有沒有人找到某種解決方法?

+0

一個解決方法是使用Bitmap.createScaledBitmap爲「比例」位圖以完全相同的大小。這通常使它更快樂。 – 2011-12-26 11:34:48

0

大小實際上是紋理的導入,例如我使用矩形作爲參數爲0,0,1024,1024的BitmapFactory.decodeStream。當然,它必須是0,0,1023,1023。一個REFFERENCE看看下面的代碼,我測試它的慾望S和銀河S2:

InputStream is = context.getResources().openRawResource(resource); 
    Bitmap bmp; 

    gl.glBindTexture(GL10.GL_TEXTURE_2D, texID[tex]); 

    // Mendatory, tells openGL how to render the texture, nearest will look sharp, smooth will look blurry 
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); 

    // Not mendatory, tells openGL what to do when sprite is smaller or bigger than object 
    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); 

    gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE); 

    try { 
     BitmapFactory.Options sBitmapOptions = new BitmapFactory.Options(); 
     // Set our bitmaps to 16-bit, 565 format...uhm, this looks more like 32 bit: 8888 
     sBitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     bmp = BitmapFactory.decodeStream(is, new Rect(0, 0, 1023, 1023), sBitmapOptions); 

     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0); 
     bmp.recycle(); 
    } finally { 
     try { 
      is.close(); 
     } catch(IOException e) { 
      // Ignore. 
     } 
    }