1

私は問題があります。それで、最初のゲームを Google Play に置いたところです。シンプルな橋づくりゲームです。

私自身、Samsung Galaxy S Plus を Android 2.3.6 で実行しています。このゲームは、私の携帯電話、Sony Xperia Ray、HTC Gratia、Samsung Ace で問題なく動作しました。

ゲームを市場に出した後、プレイヤーには白いボックスしか見えないという反応がほとんどありませんでした。これは、何らかの理由でテクスチャが機能しないことを意味します。これらの電話は、4.0.4 で動作する LG Optimus Black と Samsung Galaxy S でした。したがって、Android 4.0.4 は、Samsung Galaxy S が公式のものをリリースしていないため、Samsung 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

4

3 に答える 3

1

ああ、私はとても愚かです。したがって、drawable-nodpi ではなく drawable フォルダーにテクスチャを配置することで問題が発生しました。テクスチャは、MDPI デバイスおよび 2 のべき乗でないテクスチャをサポートするデバイス (Galaxy S Plus など) で正しく機能しました。テクスチャは 2 のべき乗ですが、画面に応じてスケーリングされます。したがって、解像度ごとにコピーを作成したくない場合は、常にテクスチャを drawable-nodpi に配置してください。

于 2012-05-17T13:34:29.830 に答える
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

    }
}

非常にエレガントなソリューションではなく、おそらくスレッドセーフでもありませんが、機能します

于 2012-05-14T20:40:13.073 に答える
0

シェーダーを使用していますか?

もしそうなら、float の精度がハードウェア依存の問題を引き起こす可能性があります。例: 内部に 1.0 を含む float ユニフォームは、int(); で 0 を返す可能性があります。1.0 ではなく 0.99 であるかのように。

使用している場合は、シェーダー コードを投稿してください。

于 2012-05-10T10:46:45.683 に答える