11

Android エミュレーターでテクスチャの破損に問題があります (ほとんどの Android デバイスで問題なく動作します)。

Android 4.1 リファレンス レンダリング

上の図は、Android 4.1 Jelly Bean を実行するエミュレーターによって作成された参照レンダリングです。すべてが正常に見えます。

アンドロイド 1.6

2 番目の画像は、Android 1.6 を実行しているエミュレーターでキャプチャされたものです。無効になっているツールバー ボタンの一部が破損していることに注意してください (色 1f、1f、1f、0.5f でレンダリングされます)。

アンドロイド 1.6

3 番目の写真は、同じエミュレーターでキャプチャされたものです。違いは、スコアが右上隅に表示されるようになったことです。スコアはビットマップ フォントで、テクスチャはアルファ マスクです。スコアの後にレンダリングされたものはすべてテクスチャを失います。前のスクリーンショットには、同じ方法でレンダリングされたビットマップ フォントも含まれていることに注意してください (ただし、テクスチャは異なります)。

Samsung デバイスの 1 つにも同様の問題がありました (モデルは覚えていません)。床のテクスチャがレンダリングされると、その後レンダリングされたすべてのテクスチャが失われました。a) テクスチャをバインドしなかった b) テクスチャをバインドしたが、それを使用して三角形を描画しなかった c) png アセットを最初から再作成した場合、問題は発生しませんでした。

OpenGL 設定:

gl.glDisable(GL10.GL_LIGHTING);
gl.glDisable(GL10.GL_CULL_FACE);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glDisable(GL10.GL_DITHER);
gl.glDepthMask(false);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glBlendFunc(GL10.GL_ONE,GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glShadeModel(GL10.GL_FLAT);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE);

テクスチャのロード方法:

public void doGLLoading(Engine renderer) {
        GL10 gl=renderer.getGl();
        int[] ids=new int[1];
        gl.glGenTextures(1, ids,0);
        id=ids[0];
        gl.glBindTexture(GL10.GL_TEXTURE_2D, id);
        Log.d("SpriteDraw", String.format("Texture %s has format %s",getPath(),bitmap.getConfig().toString()));
        buildMipmap(gl, bitmap);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, minFilter);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, magFilter);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, textureWrapS);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T, textureWrapT);
    }
private void buildMipmap(GL10 gl, Bitmap bitmap) {
    int level = 0;
    int height = bitmap.getHeight();
    int width = bitmap.getWidth();

    while (height >= 1 || width >= 1) {
        // First of all, generate the texture from our bitmap and set it to
        // the according level
                    //TextureUtils.texImage2D(gl, GL10.GL_TEXTURE_2D, level, -1, bitmap, -1, 0);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, level, bitmap, 0);
        if (height == 1 || width == 1) {
            break;
        }
        // Increase the mipmap level
        level++;
        height /= 2;
        width /= 2;
        Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, width, height,
                true);

        // Clean up
        bitmap.recycle();
        bitmap = bitmap2;
    }
}

注: フォントは と を使用してレンダリングされgl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);ますGL10.glDrawArrays。破損は 1.6 エミュレーターだけでなく、2.x シリーズの android にも影響しますが、それほど顕著ではありません (アルファ マスクは依然として正しくレンダリングされません)。すべてのアセットは、2 のべき乗ビットマップとして正しく読み込まれます。

4

1 に答える 1

2
  1. グレースケールではなく、「アルファマスク」ではなく、32ビットテクスチャを使用することをお勧めします(それは何ですか?)
  2. テクスチャのサイズを確認してください。最大サイズ ( glGetInteger( GL_MAX_TEXTURE_SIZE ) を超えないようにしてください。また、テクスチャが 2 の累乗であることを確認してください。 Android によってスケーリングされます.スケーリングを避けるために、それらを「raw」フォルダーに入れます。
  3. テストのために、ミップマップを含むすべてのフィルタリングを無効にしてみてください - GL_TEXTURE_WRAP_S と GL_TEXTURE_WRAP_T を GL_NEAREST に設定します。
于 2012-09-04T11:55:24.030 に答える