2012-05-10 41 views
1

問題があります。だから私は最初の試合をGoogle Playに入れました。それは単純な橋を構築するゲームです。OpenGL ESテクスチャが一部のデバイスに表示されない

私自身はAndroid 2.3.6で動作するSamsung Galaxy S Plusを持っています。ゲームは私の電話、ソニーXperiaレイ、HTC Gratiaとサムスンエースでうまくいった。

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

+0

私はいくつかのglGetError呼び出しをテクスチャに関連するコードブロックの周りに置くことを推奨します。明らかにデバイスへのアクセス権があれば、はるかに簡単になります。そうでない場合、デバイスを持っていない場合は、glGetErrorが0以外の場合に例外をスローすることができ、ユーザーにバグレポートを送信してスタックを呼び出して、どこから問題が発生したかを追跡することができます。残念ながら、これは多くのユーザーのために「強制終了」ダイアログを表示することがあります。このチェックをオプションで有効にして、すべてのユーザーに影響を与えないようにすることもできます。 – Tim

答えて

1
の作品

ああ、私はとても馬鹿だ。だから問題は、drawable-nodpiの代わりにdrawableフォルダにテクスチャを置くことによって引き起こされました。テクスチャは、MDPIデバイスと、2つのテクスチャの非パワー(私のGalaxy S Plusのような)をサポートするデバイスで正しく機能しました。テクスチャは2の累乗であったにもかかわらず、画面に応じて縮尺が変わりました。ですから、それぞれの解像度のコピーを作成したくない場合は、常にdrawable-nodpiにテクスチャを置きます。

0

あなたはどのシェーダを使用していますか?

もしそうなら、浮動小数点精度はh/w依存の問題につながる可能性があります。 例:浮動小数点ユニフォームが1.0の場合、int();あたかも1.0の代わりに0.99を持っているかのように。

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

+0

いいえ、シェーダは使用していません。 – Fizzics

-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 

    } 
} 

あまりエレガントな解決策は、また、おそらくスレッドセーフではありませんが、それは

+0

glGenTexturesを使用せずにテクスチャをどのように作成することをお勧めしますか?それがテクスチャオブジェクトを作成するために私が知っている唯一の方法です。 – Tim

+0

例を追加 –

+0

確かにエラーが発生します。バインドする前にテクスチャオブジェクトを作成する必要があります。独自のテクスチャインデックスを構成することはできません。これを行うには、glGenTexturesが唯一の方法です。それは 'unsigned int'を返すことになっていることに注意してください。intにキャストして負に見える場合、それはちょっと変わっても技術的に間違ったものはありません。 – Tim

関連する問題