PNG纹理没有加载HTC的愿望

时间:2010-05-19 18:57:35

标签: java android opengl-es textures

您好我正在使用OpenGL开发Android游戏并遇到问题:

我的游戏在模拟器中加载得很好(windows xp和eclipse中的vista),它在T-Mobile G2(HTC Hero)上加载也很好但是当我加载到我的新HTC Desire时,没有任何纹理似乎加载正确(或根本)。我怀疑BitmapFactory.decode方法,虽然我没有证据证明这是问题所在。

我的所有纹理都是2的力量,JPG纹理似乎加载(虽然看起来质量不是很好)但GIF或PNG的任何东西都不会加载,除了加载2x2的红色正方形和一个纹理映射到一个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.
     }
  }

感谢

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。对我来说 - 只有当png具有透明度时才会发生。 当我升级到2.2时,一切都开始发生了。在纹理工作正常之前,即使它们不是2的力量。

但现在它完全是随机的。我在GIMP中使用透明背景创建了一个png文件。用画笔绘制一些线条,在Android应用程序中显示黑色。然后我编辑了它,添加了3行,它加载好了。然后我做了一些修改,它不会再渲染:S。

我在一些示例应用程序中测试它以排除我的编码错误(http://insanitydesign.com/wp/projects/nehe-android-ports/ - 混合示例),只是根据我的需要更改了混合功能。

它的行为就像我的应用程序一样。

有没有人找到某种解决方法?

答案 1 :(得分:0)

大小实际上是纹理的导入,例如我使用矩形作为BitmapFactory.decodeStream的0,0,1024,1024的参数。当然它必须是0,0,1023,1023。参考下面的代码,我在Desire S和Galaxy 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.
        }
    }