2011-07-04 120 views
0

我一直在努力解决这个问题几个星期,现在没有结果。我确信我只是错过了一些愚蠢的东西,所以我想我会对此有一个外部意见。在Android中使用OpenGL绘制半透明纹理

我在应用程序中绘制了一堆不同的纹理,出于某种原因,其中一些纹理没有显示出来。我试图找出为什么只有某些纹理不会显示,我想我已经缩小到具有半透明像素的纹理(纹理包含alpha值不为0或255的像素)。完全不透明的纹理显示效果很好,并且具有完全关闭或完全关闭像素的纹理也可以完成。问题纹理显示为白色方块。另外,我想我应该补充一点,在模拟器中一切都很好,它只在我的测试设备(Samsung Captivate)上显示纹理。

下面是我的代码片段,显示了重要的部分,一如既往,让我知道如果你需要更多的信息。

视图设置(我已经试过这两个,但有没有与否这些行似乎没有什么区别):

gameView.setEGLConfigChooser(8,8,8,8,16,0); 
gameView.getHolder().setFormat(PixelFormat.TRANSLUCENT); 

渲染器onSurfaceCreated方法(我也尝试使深度测试没有用,我用的线都在这里评论说,当我试图深入的测试,我做了明确的每平局深度缓冲):

gl.glClearColor(0.5f, 0.5f, 0.5f, 1); 
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 
gl.glShadeModel(GL10.GL_FLAT); 
gl.glDisable(GL10.GL_DEPTH_TEST); 
//gl.glEnable(GL10.GL_DEPTH_TEST); 
//gl.glDepthFunc(GL10.GL_LEQUAL); 
gl.glEnable(GL10.GL_BLEND); 
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 
gl.glEnable(GL10.GL_TEXTURE_2D); 

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

纹理加载方法(可能它有一些做与GLUtils.texImage2D? ):

int texId; 
gl.glGenTextures(1, mTextureNameWorkspace, 0); 

texId = mTextureNameWorkspace[0]; 
gl.glBindTexture(GL10.GL_TEXTURE_2D, texId); 

if (gl instanceof GL11) { 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR_MIPMAP_NEAREST); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL11.GL_GENERATE_MIPMAP, GL11.GL_TRUE); 
} 
else { 
    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); 

gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE); 

InputStream is = res.openRawResource(resourceId); 
Bitmap bitmap = null; 
try { 
    bitmap = BitmapFactory.decodeStream(is, null, bitmapOptions); 

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

    if (gl instanceof GL11) { 
     mCropWorkspace[0] = 0; 
     mCropWorkspace[1] = bitmap.getHeight(); 
     mCropWorkspace[2] = bitmap.getWidth(); 
     mCropWorkspace[3] = -bitmap.getHeight(); 

     ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, mCropWorkspace, 0); 
    } 

    //Don't poke fun at my archaic error handler 
    int error; 
    String errorCodes = ""; 
    while ((error = gl.glGetError()) != GL10.GL_NO_ERROR) { 
     errorCodes += error + " "; 
    } 
    if (errorCodes.length() != 0) 
     throw new Exception("OpenGL error while loading texture. Error codes: " + errorCodes.substring(0,errorCodes.length()-1)); 

    textureWidth = bitmap.getWidth(); 
    textureHeight = bitmap.getHeight(); 
    textureId = texId; 

    return texId; 
} 
finally { 
    try { is.close();  } catch (IOException e) { } 
    try { bitmap.recycle(); } catch (Exception e) { } 
} 
+0

您的纹理尺寸是多少? – Wroclai

+0

这是一款2D平铺游戏。这是你的意思吗? – Klazen108

+0

Njah。您无法显示哪些尺寸的纹理? 32x32,64x64或128x128? – Wroclai

回答

2

刚刚关闭的情况下,任何人都绊倒在它的问题:

这个错误发生在由于图像保存在res /绘制。当从那里加载时,Android可以进行一些幕后处理,导致产生的图像不能被设置为2的幂。 将图像存储在res/raw中以避免此处理。