Androidが開発したOpenGLで2 Dグラフィックスを描く方法の分析

4845 ワード

Androidが開発したOpenGLで2 Dグラフィックスを描く方法を例に挙げた.皆さんの参考にしてください.具体的には以下の通りです.
AndroidはOpenGL ESサポートのためにGLSurviceView構築を提供し、この構築は3 Dグラフィックを表示するために使用される.GLSurviceView自体は、3の図形を描く機能を提供するものではなく、GLSurfaceViewによって提供する.サンダーはSurviceViewの3 Dグラフィックの描画を完了しました.
まとめるとandroidでOpenGL ESを使うには3つのステップが必要です.
1.GLSurviceViewコンポーネントを作成し、Activityを使用してGLSurfaceViewコンポーネントを表示します.
2.GLSurviceViewコンポーネントのGLSurviceView.Renderer例を作成し、GLSurviceViewを実現する.Rendererクラスではこのインタフェースの3つの方法を実現する必要がある.
(1)abstract void onDrawFrame(GL 10 gl):Renenerオブジェクトは、このメソッドを呼び出してGLSurviceViewの現在のフレームを描画する.
(2)abstract void onSurfaceChanged(GL 10 gl,int width,int height):GLSurfaceViewのサイズが変化したときにこの方法をコールバックする.
(3)abstract void onDrawFrame(GL 10 gl,ELConfig config):GLSurfaceViewが作成されたときにこのメソッドをコールバックする.
3.GLSurfaceViewコンポーネントを呼び出すsetRebderer()メソッドは、GLSurfaceView内の3 D画像の描画を完了するRenderオブジェクトを指定します.
以上の紹介から明らかなように,実際に3 D画像を描く難点はGLSurfaceコンポーネントをどのように使用するかではなく,Renderクラスをどのように実現するかである.Renderクラスを実装するには3つの方法が必要である.この3つの方法にはGLパラメータがあり、GLOpenESの「ブラシを描く」ことを表しています.Swing 2 D図面のGraphicsと想像したり、Android 2 D図面のCanvasコンポーネントと想像したりすることができます.rendererが3 D図形を描くことを望んでいる場合、実際にはGL 10を呼び出す方法で描くことができます.
Survice Viewが作成されると、次のような初期化コードのような変更を必要としないいくつかの初期化をOpenGLESに対して実行することができるRenderオブジェクトのonSurfaceCreated()メソッドがコールバックされます.

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.glShadeModel(GL10.GL_SMOOTH);
  //      
  gl.glEnable(GL10.GL_DEPTH_TEST);
  //         
  gl.glDepthFunc(GL10.GL_LEQUAL);
}


GL 10はOpenGL ESの描画インタフェースであり、ここではGL 10が見られるが、実際にはGL 11の例でもあり、読者は(gl instanceof GL 11)によってGL 11インタフェースの例であるか否かを判断することができる.
上記の方法ではGL 10のいくつかの初期化方法が用いられているが、これらの方法については以下のように説明する.
(1)GlDisable(int cap):OpenGL ESのある態様の特性を無効にする方法.この方法の最初の行コードは、耐ジッタをオフにするために使用され、パフォーマンスを向上させることができる.(2)glHint(int target,int mode):OpenGL ESのある態様を修正するための方法.(3)clearColor(float red,float green,float blue,float alpha):この方法でスクリーンの色を設定し、4つのパラメータでそれぞれ赤、緑、青、透明度値:0が最小値、1が最大値を設定します.例えばglを設定.glClearColor(0,0,0,0);黒いスクリーンを使います.(4)glShadeModel(int mode):OpenGL ESのシャドウパターンを設定する方法.シャドウスムージングモードを設定します.(5)glEnable(int cap):glDisable(int cap)法とは対照的に、OpenGL ESのある態様の特性を有効にするために用いられ、ここではOpenGL ESの深さテストを開始するために用いられ、OpenGL ESが各物体のZ軸上の深さを追跡することを担当させることで、後の物体が前の物体を遮蔽することを回避することができる.
SurviceViewによって作成されるサイズが変化すると、RendererオブジェクトのonSurfaceChanged()メソッドがコールバックされるので、このメソッドは通常3 Dシーンの初期化に使用されます.たとえば、次の初期化コードがあります.

public void onSurfaceChanged(GL10 gl,int width,int height)
{
  //  3D        
  gl.glViewport(0,0,width,height);
  //             
  gl.glMatrixMode(GL10.GL_PROJECTION);
  //       
  gl.glLoadIdentity();
  //         、   
  float ratio = (float)width/height;
  //                
  gl.glFrustumf(-ratio,ratio,-1,1,1,10);
}


上記の方法はGL 10のいくつかの初期化方法を用いており、これらの方法については以下のように説明する.
1、glViewport(int x,int y,int width,int height):3 Dウィンドウの位置と大きさを設定する.前の2つのパラメータはウィンドウの位置を指定し、後の2つのパラメータはウィンドウの幅、高さを指定します.
2、glMatrixMode(int mode):ビューのマトリクスモデルを設定します.通常GL 10を受け入れることができる.GL_PROJECTION、GL10.GL_MODELIEWの2つの定数値.glMatrixMode(GL 10.GL_PROJECTION);コードが呼び出されると、スクリーンをパースビューに設定することを指定します.これは、遠いものほど小さく見えることを意味します.glMatrixMode(GL 10. GL_MODELVIEW);コードが呼び出されると、現在のマトリクスモードがモードビューマトリクスに設定され、これは、新しい変換がマトリクス内のすべての物体に影響を及ぼすことを意味する.
3、glLoadIdentity():単位行列を初期化するためのreset()メソッドに相当する.
4、glFrustumf(float left,float right,float bottom,float top,float zNear,float zFar):パース投影の空間サイズを設定します.最初の2つのパラメータは、X軸上の最小座標値、最大座標値を設定するために使用されます.中間の2つのパラメータは、Y軸の最小座標値、最大座標値を設定するために使用されます.次の2つのパラメータは、Z軸の最小座標値、最大座標値を設定するために使用します.
たとえば、次のコードを呼び出します.

gl.glFrustumf(-0.8,0.8,-1,1,1,10);


これは、2 D長方形がある場合、その4つの頂点の座標がそれぞれ(-0.8,1)、(0.8,1)、(0.8,-1)、(-0.8,-1)であり、このマトリクスがウィンドウ全体を占めることを意味します.
GLSurfaceView上のすべての3 DグラフィックはRenderer onDrawFrame(GL10 gl)メソッドによって描画されます.このメソッドを書き換えるときは、通常、すべての3 Dグラフィックを描画します.このメソッドは、次のような形式で開始されます.

public void onDrawFrame(GL10 gl)
{
  //           
  gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
  ...
}


Androidに関する詳細に興味のある方は、「Androidグラフィックスと画像処理テクニックのまとめ」、「Android開発入門と進級チュートリアル」、「Androidデバッグテクニックとよくある問題解決方法のまとめ」、「Android基本コンポーネントの使い方のまとめ」、「AndroidビューViewテクニックのまとめ」、「Androidレイアウトlayoutテクニックのまとめ」、「Androidコントロールの使い方のまとめ」を参照してください.
この文書がAndroidプログラムの設計に役立つことを願っています.