今回からは数回OpenGLを利用してみたいと思います。
OpenGLとは描画をするのに優れたクラスですが、もっとも大きなポイントとしては、他のデバイス(iphoneや、PCなど)でも、OpenGLを用いて描画を出来るプログラムを持っている可能性が多いことです。
特にiphoneに関しては、同じプログラムを使う事が出来る為、ゲームの開発などに、利用をする事で、ほぼ同じ動きを実現できるそうです。(一部、スペックの違いや、用意されている関数の違いがあるようです。)
手順としては、
1、Activityを用意する。
2、レンダリングのクラスを用意する。
3、surfaceviewにレンダリングのクラスを組み合わせて中にいれる。
で、作成できます。
レンダリングのクラスは
GLSurfaceView.Rendererを継承したクラスなので
public class MyRenderer implements GLSurfaceView.Renderer{ public void onDrawFrame(GL10 gl) {} public void onSurfaceChanged(GL10 gl, int width, int height) {} public void onSurfaceCreated(GL10 gl, EGLConfig config) {} }
上記の3つの関数を用意する必要があります。
Activityクラス(onCreate)では下記のように、Surfaceviewを作成して、それにrendererを組み合わせます。
MyRenderer _renderer = new MyRenderer(); GLSurfaceView _glSurfaceView = new GLSurfaceView(this); _glSurfaceView.setRenderer(_renderer); setContentView(_glSurfaceView);
これでカンタンにOpenGLの表示ができてるのですが、中には何も表示されていません。
次に三角形を書いてみましょう。
■onSurfaceCreatedへの設定
三角形を書くために各頂点を表すvertexを利用できるようにします。
gl10.glEnableClientState(GL10.GL_VERTEX_ARRAY);
各頂点を表す座標を決めます。
float[] vertexs={ 0.0f,1.0f, 0.0f,0.0f, 1.0f,0.0f };
上記は点1(0,1)、点2(0,0)、点3(1,0)の3点の座標の集まりです。ここでの単位に関しては、自分で決める事のできる単位になります。が、特に何も設定していない場合は、左下が(0,0)で右上が(1,1)となります。
また、少し複雑にはなるのですが、OpenGLではCPU領域をActivityから受け継ぐ事が出来ない為、独自に設定をしてあげる必要があります。(座標のデータを保持しておくためのメモリスペースの確保をしてあげたい。)
下記のような外部クラスを作成しても、内部に関数を容易してもよいのですが、FloatBufferの値が返る関数に配列をメモリに変換してもらいます。
public class GraphicUtil{ public static final FloatBuffer makeFloadtBuffer(float[] arr){ ByteBuffer bb = ByteBuffer.allocateDirect(arr.length*4); bb.order(ByteOrder.nativeOrder()); FloatBuffer fb = bb.asFloatBuffer(); fb.put(arr); fb.position(0); return fb; } }
vertexBuffer=GraphicUtil.makeFloatBuffer(vertexs);
※上記に関して、配列の長さに4をかけているのはfloatが、1文字4byteの為です。
■onSurfaceChangedへの設定
ウインドウのサイズが変更された際また、動作の最初に実行される為、表示の領域をここで指定をします。
gl.glViewport(0,0,width,height);
width,heightはonSurfaceChangedの引数として得られる値を登録します。
■onDrawFrameへの設定
基本的に、この関数が毎回実行されるので、
毎回描画を行うなどします。
gl.glClearColor(0.5f,0.5f,0.5f,1.0f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
上記で背景色を設定します。glClearColorでは、RGBAを設定できます。glClearColorで設定した色がステージ全体に描画されます。
色を指定します。
gl.glColor4f(1.0f,0.0f,0.0f,1.0f);
ここで、配列の値から取得したバッファーのメモリ分を登録します。
gl.glVertexPointer(2,GL10.GL_FLOAT,0,vertexBuffer);
ここで描画(2つ目の引数はoffsetの為利用頻度はすくない、3つめの引数は頂点の数。)
gl.glDrawArrays(GL10.GL_TRIANGLES,0,3);
上記で三角形の表示の為に必要な一通りの関数を説明しました。(具体例は時間がある時に貼り付けます。)