JavaとJavaEEプログラマのブログ

JavaEEを中心にしたをソフトウェア開発についてのブログ

正方形を描く

eclipseAndroidプロジェクトを作って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) {

	}

}