Android 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を作成する.レンダーの例は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コンポーネントをどのように使用するか,20がどのように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_MODELIEW)が呼び出されると、コードの後、現在のマトリクスモードをモードビューマトリクスに設定します.これは、新しい変換がマトリクス内のすべての物体に影響を与えることを意味します.
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(GL 10 gl)メソッドによって描画されます.このメソッドを書き換えるときは、すべての3 Dグラフィックを描画する必要があります.このメソッドは通常、次のような形式で開始されます.
public void onDrawFrame(GL10 gl)
{
	//           
	gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
	...
}