我有问题。所以我把我的第一款游戏放在Google Play上。这是一个简单的桥梁建造游戏。
我自己在Android 2.3.6上运行三星Galaxy S Plus。这款游戏在我的手机,索尼Xperia Ray,HTC Gratia和三星Ace上运行良好。
将我的游戏推向市场之后,我得到了一些回应,告诉我玩家只看到白盒子,这意味着纹理由于某种原因不起作用。这些手机是LG Optimus Black和三星Galaxy S在4.0.4上运行。所以Android 4.0.4是针对三星Galaxy S定制的,因为它们没有发布官方版本。
怎么办?我的所有图像都是24位PNG,并且都是2的幂。
以下是我加载它们的方法:
/** @return texture ID
*/
public int loadTexture(int resource)
{
int[] temp = new int[1];
gl.glGenTextures(1, temp, 0);
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
resource);
gl.glBindTexture(GL10.GL_TEXTURE_2D, temp[0]);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
// recycle the bitmap
bitmap.recycle();
return temp[0];
}
以下是链接:https://play.google.com/store/apps/details?id=com.fizzicsgames.trainthemtocrosslite
答案 0 :(得分:1)
哦,我真是太蠢了。所以这个问题是由于将纹理放在drawable文件夹而不是drawable-nodpi引起的。纹理在MDPI设备和支持2种纹理的非功能的设备(如我的Galaxy S Plus)上正确工作。即使纹理是2的幂,它们也会根据屏幕缩放。因此,如果您不想为每个分辨率创建副本,请始终将纹理放在drawable-nodpi中。
答案 1 :(得分:0)
您使用的是任何着色器吗?
如果是这样,浮动精度可能导致h / W依赖性问题。 例如:一个内部带有1.0的浮动制服可能会在int()上给你0;好像它有0.99而不是1.0。
如果您正在使用它,请发布着色器代码。
答案 2 :(得分:-1)
问题是glGenTextures
。我的建议是不要使用它,而是实现自己的跟踪纹理的系统。
如果您调试并查看glGenTextures
投放到temp[0]
的值,您会在某些设备上看到每次调用时它会给您一个明智的1,2,3 。在其他设备上调试相同的代码,您可能会看到1000056737,-31895888等
编辑例如:
public class Texture{
public static int texturecount = 0;
public void loadTexture(Context context){
int[] textures = new int[1];
textures[0] = Texture.texturecount;
Texture.texturecount.texturecount++;
//...and bind it to our array
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
// etc
}
}
不是一个非常优雅的解决方案,也可能不是线程安全的,但它可以正常工作