Android OpenGL ES纹理赢得';有些设备上没有显示
我有个问题。所以我把我的第一个游戏放在Google Play上。这是一个简单的桥牌搭建游戏 我自己也有三星Galaxy S Plus在安卓2.3.6上运行。这款游戏在我的手机、索尼Xperia Ray、HTC Gratia和三星Ace上运行良好 在将我的游戏投放市场后,我几乎没有得到回应,告诉我玩家看到的只是白色的盒子,这意味着由于某种原因纹理不起作用。这些手机是LG Optimus Black和三星Galaxy S,运行在4.0.4上。所以Android 4.0.4是三星Galaxy S的定制版,因为三星Galaxy S没有发布官方版本 怎么办?我所有的图片都是24位PNG,都是2的幂 下面是我加载它们的方式:Android OpenGL ES纹理赢得';有些设备上没有显示,android,opengl-es,Android,Opengl Es,我有个问题。所以我把我的第一个游戏放在Google Play上。这是一个简单的桥牌搭建游戏 我自己也有三星Galaxy S Plus在安卓2.3.6上运行。这款游戏在我的手机、索尼Xperia Ray、HTC Gratia和三星Ace上运行良好 在将我的游戏投放市场后,我几乎没有得到回应,告诉我玩家看到的只是白色的盒子,这意味着由于某种原因纹理不起作用。这些手机是LG Optimus Black和三星Galaxy S,运行在4.0.4上。所以Android 4.0.4是三星Galaxy S的定制
/** @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];
}
下面是链接:您是否使用了着色器 如果是这样,浮动精度可能会导致与h/w相关的故障。 例如:一个内部为1.0的float统一可能会在int()上为0;好像它是0.99而不是1.0
如果正在使用着色器代码,请发布它。是否正在使用任何着色器 如果是这样,浮动精度可能会导致与h/w相关的故障。 例如:一个内部为1.0的float统一可能会在int()上为0;好像它是0.99而不是1.0
如果正在使用着色器代码,请发布它。问题在于
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
}
}
这不是一个非常优雅的解决方案,也可能不是线程安全的,但它可以工作问题是
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
}
}
这不是一个非常优雅的解决方案,也可能不是线程安全的,但它可以工作哦,我太傻了。因此,问题是将纹理放置在drawable文件夹而不是drawable Nodepi中造成的。纹理在MDPI设备和支持非幂2纹理的设备(如我的Galaxy S Plus)上正常工作。即使纹理是2的幂,它们也会根据屏幕进行缩放。因此,如果不想为每个分辨率创建一个副本,请始终将纹理放置在drawable nodpi中。哦,我太蠢了。因此,问题是将纹理放置在drawable文件夹而不是drawable Nodepi中造成的。纹理在MDPI设备和支持非幂2纹理的设备(如我的Galaxy S Plus)上正常工作。即使纹理是2的幂,它们也会根据屏幕进行缩放。因此,如果不想为每个分辨率创建一个副本,请始终将纹理放置在drawable nodpi中。您建议如何创建没有GlgenTexture的纹理?这是我所知道的创建纹理对象的唯一方法。这肯定会产生错误,必须先创建纹理对象,然后才能绑定它。你不能只制作你自己的纹理索引。glGenTextures是实现这一点的唯一方法。请注意,它应该返回一个“unsigned int”,所以如果你将它转换为int,它看起来是负数,这在技术上没有什么问题,即使它有点奇怪。嗯,实际上我研究了一点,也许你可以创建一个纹理而不调用glGenTextures(虽然这在规范中,但我现在找不到)。无论如何,可能仍然不是一个非常安全的想法。好吧,java缺少一个无符号int。我一直认为
glGenTextures
只是一个方便的方法。我使用了上面的例子,没有看到任何负面影响(没有错误),但我正在做相对简单的纹理多边形(没有照明,没有着色器等)。顺便说一句,如果我以android 2.1(API lvl 7)为目标,因此使用opengl es 1.1,你也可以在我的Kindle fire设备上做textures[0]=纹理[0],并调用gl.glGenTextures而不是GLES20.glGenTextures(),这样它就可以正常工作。只有在针对API lvl 10并使用GLES20时,我才发现这个问题:您究竟建议如何创建没有GLGenTexture的纹理?这是我所知道的创建纹理对象的唯一方法。这肯定会产生错误,必须先创建纹理对象,然后才能绑定它。你不能只制作你自己的纹理索引。glGenTextures是实现这一点的唯一方法。请注意,它应该返回一个“unsigned int”,所以如果你将它转换为int,它看起来是负数,这在技术上没有什么问题,即使它有点奇怪。嗯,实际上我研究了一点,也许你可以创建一个纹理而不调用glGenTextures(虽然这在规范中,但我现在找不到)。无论如何,可能仍然不是一个非常安全的想法。好吧,java缺少一个无符号int。我一直认为glGenTextures
只是一个方便的方法。我使用了上面的例子,没有看到任何负面影响(没有错误),但我正在做相对简单的纹理多边形(没有照明,没有着色器等)。顺便说一句,如果我以android 2.1(API lvl 7)为目标,因此使用opengl es 1.1,你也可以在我的Kindle fire设备上做textures[0]=纹理[0],并调用gl.glGenTextures而不是GLES20.glGenTextures(),这样它就可以正常工作。只有在针对API lvl 10并使用GLES20时,我才会遇到这个问题。我建议在与纹理相关的代码块周围放置一些glGetError调用。如果你能访问一个设备,显然会容易得多。否则,如果没有设备,如果得到非零glGe,则可能引发异常