OpenGL ES纹理不会出现在某些设备上

时间:2012-05-10 10:05:15

标签: android opengl-es

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

3 个答案:

答案 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

    }
}

不是一个非常优雅的解决方案,也可能不是线程安全的,但它可以正常工作