您好我正在使用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.
}
}
感谢
答案 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.
}
}