我遇到了Android模擬器上的紋理損壞問題(它在大多數Android設備上運行良好)。Android opengl紋理損壞
上面的圖片是運行Android 4.1果凍豆仿真器產生的參考渲染,一切看起來都理所應當。
第二畫面爲在仿真器捕獲的運行Android 1.6。需要注意的一些禁用的工具欄按鈕的腐敗(它們呈現的色彩1F,1F,1F,0.5F)
第三畫面在同一個仿真器捕獲。不同之處在於現在得分顯示在右上角。 Score是一個位圖字體,它的紋理是一個alpha蒙版。在比分之後呈現的所有東西都鬆動了它的質感。請注意,以前的屏幕截圖還包含以相同方式呈現的位圖字體(但使用不同的紋理)。
在其中一個三星設備上出現類似的問題(我不記得該型號)。渲染地面紋理時,渲染後的所有內容都會丟失紋理。當我或者a)沒有綁定紋理時,問題並沒有表現出來b)綁定了紋理,但沒有使用三角形c)重新創建了png資產。
OpenGL設置:
gl.glDisable(GL10.GL_LIGHTING);
gl.glDisable(GL10.GL_CULL_FACE);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glDisable(GL10.GL_DITHER);
gl.glDepthMask(false);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glBlendFunc(GL10.GL_ONE,GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glShadeModel(GL10.GL_FLAT);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE);
如何紋理加載:
public void doGLLoading(Engine renderer) {
GL10 gl=renderer.getGl();
int[] ids=new int[1];
gl.glGenTextures(1, ids,0);
id=ids[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, id);
Log.d("SpriteDraw", String.format("Texture %s has format %s",getPath(),bitmap.getConfig().toString()));
buildMipmap(gl, bitmap);
gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, minFilter);
gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, magFilter);
gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, textureWrapS);
gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T, textureWrapT);
}
private void buildMipmap(GL10 gl, Bitmap bitmap) {
int level = 0;
int height = bitmap.getHeight();
int width = bitmap.getWidth();
while (height >= 1 || width >= 1) {
// First of all, generate the texture from our bitmap and set it to
// the according level
//TextureUtils.texImage2D(gl, GL10.GL_TEXTURE_2D, level, -1, bitmap, -1, 0);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, level, bitmap, 0);
if (height == 1 || width == 1) {
break;
}
// Increase the mipmap level
level++;
height /= 2;
width /= 2;
Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, width, height,
true);
// Clean up
bitmap.recycle();
bitmap = bitmap2;
}
}
注:字體使用gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
和GL10.glDrawArrays
渲染。腐敗不僅會影響1.6模擬器,還會影響android的2.x系列,儘管它不如突出(alpha掩碼仍然渲染不正確)。所有資產都正確加載爲兩個位圖的權力。
紋理尺寸是兩個冪嗎?你用superPng還是Png?正常的png文件不能正確保留alpha作爲掩碼。但superPng可以保留它。一個用於photoshop的插件可以導出爲superPng – Behnam
是的,它們都是Power of Two(在帖子末尾提到)。位圖存儲爲灰度位圖,由android加載爲ARGB_8888,並通過我的代碼轉換爲alpha蒙版。 – rkapl