Android OpenGL ES纹理赢得';有些设备上没有显示

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的定制

我有个问题。所以我把我的第一个游戏放在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的幂

下面是我加载它们的方式:

/** @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,则可能引发异常