2016-03-25 17 views
0

私のアプリでは、GLSurfaceViewを使用して、表示される内容に応じて変化する2次元の背景イメージを表示します。画像は、携帯電話の画面と同じアスペクト比の単純な長方形にレンダリングされたテクスチャとして使用されます。背景が変化すると、アルファブレンドのトランジション効果がレンダリングされます。デバイスがOpen GL ES 2.0をサポートしていない場合は、代わりにスタティックイメージが使用されます。Android:OpenGLのテクスチャが一部のデバイスで白くなる

いくつかのデバイス(LG E455など)では、バックグラウンドが白くなってアプリが使用できなくなっているとの報告がありましたが、上に表示されるテキストも白であるためです。私は問題の解決策を探していましたが、何も見つかりませんでした。

私は広告なしで無料でアプリを提供しているため(広告はアプリに適合しないと思う)、外部資金を受けていないため、問題のデバイス(LG E455)を購入することはできませんこれは古いデバイスなので、この1つの問題をデバッグする唯一の目的のためです。

私はテクスチャをロードするには、次のコードを使用しています:

int getTexture(GL10 gl, int index) { 
    if (BackgroundRenderer.this.textures[index] == 0) { 
     gl.glGenTextures(1, BackgroundRenderer.this.textures, index); 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, BackgroundRenderer.this.textures[index]); 

     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 

     Bitmap bitmap = ResourceStore.getBackgroundBitmap(index); 

     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
    } 

    return BackgroundRenderer.this.textures[index]; 
} 

バージョンチェックと初期化:

private static boolean supportsOpenGLES2(Context context) { 
    ActivityManager activityManager = (ActivityManager) 
      context.getSystemService(Context.ACTIVITY_SERVICE); 
    ConfigurationInfo configurationInfo = 
      activityManager.getDeviceConfigurationInfo(); 
    return configurationInfo.reqGlEsVersion >= 0x20000; 
} 

public BackgroundManager(Context context, ViewPager eventSource) { 
    this.context = context; 
    supportsRendering = BackgroundManager.supportsOpenGLES2(context); 
    eventSource.setTag(id.TAG_BACKGROUND_MANAGER, this); 

    if (this.supportsRendering) { 
     this.backgroundSurfaceView = new GLSurfaceView(context); 
     this.backgroundSurfaceView.setFocusable(false); 
     this.backgroundSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); 
     eventSource.addOnPageChangeListener(BackgroundManager.getRenderer()); 
     this.backgroundSurfaceView.setRenderer(BackgroundManager.getRenderer()); 
     this.backgroundSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT); 
    } else { 
     this.backgroundStillView = new View(context); 
    } 
} 

をあなたはより多くのコードが必要な場合は、私に教えてください。

私はいくつかの可能な解決策について考えている:

a)は、問題を解決する(方法がわからない...)

b)は、デバイスがそれをサポートしていない場合には派手なエフェクトを無効にします、しかしここでの質問は、レンダリングが先に動作するかどうかをどのように検出できますか?デバイスはOpen GL 2.0のバージョンチェックに合格します。

c)OpenGLではなく、別のレンダリングソリューションに移行します。これは、自分の目的にとって過度の不満を感じているからです。助言がありますか?

注:私は別のAPIを使用して、デバイスがhttp://specdevice.com/showspec.php?id=02c2-cba8-ffff-ffffebe99653ごとに拡張をサポートしていますので、Android 'white box' textures OpenGL ES 1.0 on some devicesに提案された解決策は、適用されません(私は情報が信用できる/正しいかどうかわからないが)

感謝あなたの提案のためにあなた!

答えて

2

ここで問題となるのは、一部のデバイスでは非2のテクスチャをサポートしていないことです。このため、一部のデバイスでは白いテクスチャが表示されます。

これを解決するには、テクスチャを生成するときに常に2のべき乗のビットマップを使用することをお勧めします。

2の累乗のビットマップは、幅/高さが2の累乗(256,512,1024など)のビットマップです。現時点では、ResourceStore経由でビットマップをロードしていますが、このツールではPO2ビットマップが作成されているのではないでしょうか。

は、この問題を克服するため、次の手順に従います。

  1. 作成します(その500x800、たとえば言うことができます)あなたは
  2. があなたのビットマップの寸法を探すやっている通常通りあなたのビットマップを作成します。 PO2で元のビットマップ(この例では512x1024)より大きい新しいビットマップ
  3. 元のビットマップをこの新しいビットマップにコピーし、元のビットマップサイズを維持して、新しいビットマップの右側に空白領域があるようにします。下。
  4. テクスチャ座標を調整します - x座標の場合は1、y座標の場合は1の代わりに500/512を使用し、800/1024を使用します。これにより、その醜い白いコーナーが表示されなくなります。

ここでは、コードの例です:

public void getTexture(GL10 gl, int index) { 
    if (BackgroundRenderer.this.textures[index] == 0) { 
     //calls to gl.glGenTextures, gl.glBindTexture etc 

     Bitmap originalBitmap = ResourceStore.getBackgroundBitmap(index); 

     int po2W = 1; 
     int po2H = 1; 

     while (po2W < originalBitmap.getWidth()) 
      po2W *= 2; 

     while (po2H < originalBitmap.getHeight()) 
      po2H *= 2; 

     Bitmap po2Bitmap = Bitmap.createBitmap(po2W, po2H, Config.ARGB_8888); 

     Canvas canvas = new Canvas(po2Bitmap); 
     canvas.drawBitmap(originalBitmap, 0, 0, myPaint); 

     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, po2Bitmap, 0); 

     // these ratios need to be used for setting the texture coordinates! 
     mWidthRatio = (float)orignalBitmap.getWidth()/(float)po2Bitmap.getWidth(); 
     mHeightRatio = (float)orignalBitmap.getHeight()/(float)po2Bitmap.getHeight(); 
    } 

    return BackgroundRenderer.this.textures[index]; 
} 

さて、あなたはテクスチャを再定義する必要があります座標:

float textureData[] = { 
     0,   0,    // top left 
     0,   mHeightRatio, // bottom left 
     mWidthRatio, mHeightRatio, // bottom right 
     mWidthRatio, 0    // top right 
}; 

今、あなたが行くように良いことがあります。

問題がある場合は教えてください。

+0

本当にありがとう、私の問題を解決しました!このような簡単なソリューションを提供していただきありがとうございます。実装が簡単でした! –

関連する問題