AndroidでOpenGLを使って何か描画してみよう。
OpenGLと言えば3Dグラフィックスのライブラリという側面が強いのだが、まずは2Dから入っていくことにする。
始めに、画面の中心に四角形を描いてみる。プログラムは以下のようになった。
MainActivity.java
package com.lesson.gl; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.app.Activity; import android.opengl.GLSurfaceView; import android.opengl.GLSurfaceView.Renderer; import android.os.Bundle; public class MainActivity extends Activity { private GLSurfaceView glSurfaceView; // ネイティブから直接参照可能なバッファを作成 private static final FloatBuffer makeFloatBuffer(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; } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); glSurfaceView = new GLSurfaceView(this); glSurfaceView.setRenderer(new Renderer() { @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { // GLで利用する領域を設定 gl.glViewport(0, 0, width, height); float ratio = (float) height / width; gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); // 正射影モードで座標系を設定 // 左上(-1.0,-ratio) 右下(1.0f,ratio) gl.glOrthof(-1.0f, 1.0f, -ratio, ratio, 0.5f, -0.5f); } @Override public void onDrawFrame(GL10 gl) { // 画面を塗りつぶす gl.glClearColor(0.f, 0.f, 1.f, 1.f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); // 四角形の座標 float[] vertices ={ -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, }; FloatBuffer fb = makeFloatBuffer(vertices); // 四角形の描画 gl.glVertexPointer(2, GL10.GL_FLOAT, 0, fb); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); } }); setContentView(glSurfaceView); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); glSurfaceView.onPause(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); glSurfaceView.onResume(); } }
AndroidでOpenGLを扱うにはGLSurfaceViewを使うと便利である。
GLSurfaceViewには、Rendererインターフェースの実装クラスをセットする必要がある。
37行目でGLSurfaceView#setRenderer()メソッドを使い、Rendererをセットしている。
44行目のonSurfaceChanged()メソッド内で画面領域の設定と座標系の設定を行う。
59行目のonDrawFrame()メソッドは繰り返し呼ばれるメソッドである。この中に描画処理を書く。
今回は、画面を青色に塗りつぶし、四角形を描いているだけである。
四角形の座標は配列にしてOpenGLに渡すのだが、Javaの配列をそのまま渡すことはできない。
そこで、Javaの配列を、ネイティブから直接参照可能な配列に変換する。21行目のmakeFloatBufferはそのためのメソッドである。
ここまでのプログラムを実行すると、以下のように表示される。
ピンバック: 【Android】OpenGLの学習(2) 拡大・縮小と回転(2D) – ザワプロ!