Android OpenGL ES の透明な背景
-
19-09-2019 - |
質問
OpenGL を利用する Android アプリを構築しています。現状では、その背景には、 GLSurfaceView
コードによって動的に生成され、テクスチャとしてロードされ、描画されます。 glDrawTexfOES
. 。これは「OK」ですが、(OpenGL を使用せずに) 画像を独自の表面にはるかにスムーズに表示することができます。の背景を作る方法はありますか? GLSurfaceView
透明?これができるという噂を聞いたことがあります setEGLConfigChooser
, しかし確証は見つかりませんでした。最終的には、描画しているサーフェスを取得して、 GLSurfaceView
その上に重ねてレイヤード効果を実現します。
これは難しく、おそらく実行不可能であることは承知していますが、ご意見をお待ちしております。前もって感謝します。
解決
ただ、いくつかの簡単な変更ます。
私のGLSurfaceView.Renderer
オンます:
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glDisable(GL10.GL_DITHER);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,
GL10.GL_FASTEST);
gl.glClearColor(0,0,0,0);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glEnable(GL10.GL_DEPTH_TEST);
}
私のGLSurfaceView
オンます:
setEGLConfigChooser(8, 8, 8, 8, 16, 0);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
他のヒント
あなたのGLSurfaceView
もsetZOrderOnTop(true);
が必要です。
私は(背景が透明/オーバーレイ)のチャートを表示するには、私自身のGLSurfaceViewクラスを使用します。 私の拡張GLSurfaceViewはポップオーバーウィンドウにXMLを経由して埋め込むされます。
<com.dsignmatters.iq_fitfunlite.GLPieChartView
android:id="@+id/gameprogress_chart"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
...
活動の一環として、私はこのコードを追加します:
mGamesuccessPieChart = (GLSurfaceView) gameprogressView.findViewById(R.id.gameprogress_chart);
mGamesuccessPieChart.setZOrderOnTop(true);
ではなく、少なくとも最後に、私のGLSurfaceViewは次のようになります:
public class GLPieChartView extends GLSurfaceView {
public GLPieChartView(Context context) {
super(context);
initGL();
}
public GLPieChartView(Context context, AttributeSet attrs) {
super(context, attrs);
initGL();
}
void initGL() {
setEGLContextClientVersion(2);
setEGLConfigChooser(8,8,8,8,16,0);
setRenderer(new GLPieChartRenderer());
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
}
}
私のレンダラクラスGLPieChartRenderer
は全くglClearColor
を呼び出すことはありません。
最後のコードサンプルは、透明性を有効にするためのものです。 GLSurfaceView
. 。ただし、透明度を使用する前に、 GLSurfaceView
, 、次のマイナス点を考慮してください。
- 透明性を有効にするには、以下を使用する必要があります
setZOrderOnTop
の上GLSurfaceView
. 。これにより、他のビューを配置できなくなります (例:TextView
) 透明の上にGLSurfaceView
. 。ナビゲーションドロワーでさえ、透明なドロワーの上にスライドすることはできませんGLSurfaceView
(無視 トリック )。透明か否か、GLSurfaceView
他の Android ビューの上または下にのみ存在でき、それらの間には存在できません。 - 透明性を得るには、以下を使用する必要があります。
setEGLConfigChooser
そしてsetFormat
以下の例のように。つまり、その特定のデバイスに最適な、システムによって選択されたデフォルトの形式を取得することはできません。さらに重要なのは、デバイスがサポートされている形式であることを確認し、この gsoc のように期待される形式が存在しない場合は代替手段を選択する必要があることです。 例.
透明性に関するその他のオプション.
- ランニング
Tracer
Android の opengl の場合、アクティビティの背景画像が opengl テクスチャとして描画されることがわかります。だから、作る代わりにGLSurfaceView
可能であれば、GLSurfaceView で背景を opengl テクスチャとしてレンダリングすることもできます。 - また、サーフェス上のアルファ チャネルまたは透明度は、opengl でのアルファ ブレンディングの前提条件ではありません。どちらも独立しています。
TextureView
(騙す) opengl コンポーネントを他のビューの間に埋め込む場合は、これが良い代替手段となります。これ 起こる ゲームは非常に良い例ですGLSurfaceView
Android での 2D 描画。
透明なレイアウト XML とコードを含む以下のサンプル GLSurfaceView
背景付き。
XMLファイルをレイアウトする
green
背景色<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:background="#00FFFF"> <android.opengl.GLSurfaceView android:id="@+id/mySurfaceView" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>
MainActivity.java ファイル。変化
ALPHA
表面の色を確認するには 0.0 ~ 1.0 の変数を使用しますred
背景アクティビティの色と混合するgreen
package com.example.transparentsurfaceview; import android.app.Activity; import android.graphics.PixelFormat; import android.opengl.GLES20; import android.opengl.GLSurfaceView; import android.os.Bundle; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; public class MainActivity extends Activity { private GLSurfaceView mSurfaceView; private static float ALPHA = 0.5f; private static float RED = 1.0f; private static float GREEN = 0.0f; private static float BLUE = 0.0f; protected void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); setContentView( R.layout.activity_main ); mSurfaceView = (GLSurfaceView)findViewById( R.id.mySurfaceView ); mSurfaceView.setEGLContextClientVersion( 2 ); mSurfaceView.setZOrderOnTop( true ); mSurfaceView.setEGLConfigChooser( 8, 8, 8, 8, 16, 0 ); mSurfaceView.getHolder().setFormat( PixelFormat.RGBA_8888 ); mSurfaceView.setRenderer( new GLSurfaceView.Renderer() { public void onSurfaceCreated( GL10 gl10, EGLConfig eglConfig ) { GLES20.glClearColor( RED, GREEN, BLUE, ALPHA ); } public void onSurfaceChanged( GL10 gl10, int i, int i2 ) {} public void onDrawFrame( GL10 gl10 ) { GLES20.glClear( GLES20.GL_COLOR_BUFFER_BIT ); } }); } }
あなたは活動の背景が透明であることを確認しなければならない!
アクティビティの背景が不透明である場合は、コンテンツビュー(glsurfaceview)は半透明であっても、その後、それがその背景としての活動の白い背景が表示されます、デフォルトでは白と言っています。
あなたが助けを公式APIのデモTranslucentGLSurfaceViewActivityを参照してください、それが宣言されAndroid.manifestでの活動の背景の透明度を設定することができます。