2012-09-22 55 views
1

我對OpenGl完全陌生,所以要善良。 在我的應用程序中,我使用的是JPG和PNG紋理。在HTC Desire(android 2.2)或Xperia x8(android 2.1)上,一切都顯示正常,屏幕如下:http://imageshack.us/photo/my-images/534/xperia.png/)。但在較新的設備,如三星Galaxy Tab 10.1(安卓3.2)或三星Galaxy S3(安卓4.x)JPG紋理是由顏色分隔?並轉向:http://imageshack.us/photo/my-images/855/samsungbs.png/。儘管如此,PNG總是顯示正常。Android OpenGL ES爲什麼JPG紋理在某些設備上顯示錯誤?

我正在使用GLSurfaceView進行繪製。而我的代碼負責製作的質感看起來是這樣的:

gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[i]); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
     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); 
     if (bitmaps[i].hasAlpha()) { 
      GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, bitmaps[i], 0); 
     } else { 
      GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGB, bitmaps[i], 0); 
     } 

通過「位圖[I] .hasAlpha()」我試圖區分給定的位圖是JPG或PNG。我哪裏可以錯了?

+0

如果你擺脫alpha檢查並使用RGBA,會發生什麼? – Geobits

+0

@Aetherna請問您可以再次上傳您的示例圖片嗎?鏈接已經死亡。我可能有類似的問題,如果我可以通過檢查圖像進行驗證,那就太好了。非常感謝! –

回答

0

我猜這些不是2次冪的紋理?如果是這樣,也許它不工作的設備不處理非2次冪的紋理。這裏肯定有一個對齊/音調的事情發生。

+0

@Geobits:當我刪除阿爾法檢查沒有任何反應。這個阿爾法是以前的戰鬥與適當的顏色顯示:(。 吉姆巴克:紋理是正方形,兩個冪,並存儲在nodpi文件夾或加載「noScaling」選項 – Aetherna

+0

這看起來像一個RGBA圖像在RGB圖像中進行解釋,圖像中的形狀被「包裹」了1.3333333倍,這正是RGBA-as-RGB紋理像素陣列的樣子。 –

0

謝謝吉姆巴克。 就像你說的。在某些設備上,jpg必須被錯誤地解釋,並且陷入「沒有alpha如果」而是RGBA格式。 這如果statment是不必要的,它是更好地使用基本texImage2D方法:雖然

 gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[i]); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
     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); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmaps[i], 0); 

我以前的OGL配置,出事質感的顏色,其中顯示錯誤。所以下面是我的配置,在我所有的設備上都很好用。

private void configureGL(GL10 gl) { 
     gl.glDisable(GL10.GL_DITHER); 
     gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 
     gl.glClearColor(1, 0, 0, 1); 
     gl.glEnable(GL10.GL_CULL_FACE); 
     gl.glShadeModel(GL10.GL_SMOOTH); 
     gl.glEnable(GL10.GL_DEPTH_TEST); 
     gl.glViewport(0, 0, screenWidth, screenHeight); 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     GLU.gluOrtho2D(gl, 0.0f, BASE_SCREEN_WIDTH, 0.0f, BASE_SCREEN_HEIGHT); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 
     gl.glShadeModel(GL10.GL_FLAT); 
     gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
     gl.glEnable(GL10.GL_ALPHA_TEST); 
     //that's a temporal hack below for removing white borders around textures (not a good practice :P) 
     gl.glAlphaFunc(GL10.GL_GREATER, 0.4f); 
    } 

對於類似的問題PPL:

之前,我用的是從頭開始我自己的引出線和建築結構。這在一些設備上造成了奇怪的顏色,並使我使用這個「if aplha」語句。現在,我使用了帶有實現的Renderer的GLSurfaceView(來自「Android Wireless Application Developement,Second Edition」的樣本),而基本的texImage2D就像魅力一樣。

相關問題