正方形を描く
eclipseでAndroidプロジェクトを作ってActivityを作成。
Activityの中でレンダーを行うGLRendererクラスを使用して描画する。
import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Bundle; public class GLSurfaceViewTest extends Activity { //OpenGLESビュー private GLSurfaceView mGLSurfaceView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //GLサーフェイスビューを作成して設定 mGLSurfaceView = new GLSurfaceView(this); // mGLSurfaceView.setDebugFlags(GLSurfaceView.DEBUG_LOG_GL_CALLS | GLSurfaceView.DEBUG_CHECK_GL_ERROR); mGLSurfaceView.setRenderer(new GLRenderer()); setContentView(mGLSurfaceView); } @Override protected void onResume() { super.onResume(); mGLSurfaceView.onResume(); } @Override protected void onPause() { super.onPause(); mGLSurfaceView.onPause(); } }
GLRendererはこんな感じ。
ポリゴンデータはFloatBufferを使って渡す必要がある。
これで真っ赤な背景に水色の正方形が描画される。
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.opengl.GLSurfaceView; public class GLRenderer implements GLSurfaceView.Renderer { static final float [] square = new float[]{ -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, -0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 0.0f, }; @Override public void onDrawFrame(GL10 gl) { FloatBuffer squareBuffer; ByteBuffer bb = ByteBuffer.allocateDirect(square.length * 4); bb.order(ByteOrder.nativeOrder()); squareBuffer = bb.asFloatBuffer(); squareBuffer.put(square); squareBuffer.position(0); gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); //画面クリア gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); // GLU.gluOrtho2D(gl, -1.0f, 1.0f, -1.0f, 1.0f);//0.0を中心とする2次元座標系を指定する。 gl.glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, 0.5f, -0.5f);//0.0を中心とする座標系 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, squareBuffer);//描画する頂点配列を設定 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//頂点配列を有効にする。 gl.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); //画面クリアカラー設定 gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //画面クリア gl.glColor4f(0, 1, 1, 1); gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 2); gl.glColor4f(0, 1, 1, 0); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { } }