androidのopenglesをつかってみる。三角形の描画

色々サンプルはあるけど、無駄なものがおおい。
必要な部分をしぼって描いてみた。

activity。

import android.app.Activity;
import android.os.Bundle;
import android.opengl.GLSurfaceView;

public class MainActivity extends Activity {
	private GLSurfaceView mGLView;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);
        mGLView = new GLSurfaceView(this);
        mGLView.setRenderer(new GLRenderer());
        this.setContentView(mGLView);
    }
    @Override
    protected void onPause(){
    	super.onPause();
    	mGLView.onPause();
    }
    @Override
    protected void onResume(){
    	super.onResume();
    	mGLView.onResume();
    }
}

レンダリング部分。

import android.opengl.GLSurfaceView;
import javax.microedition.khronos.egl.*;
import javax.microedition.khronos.opengles.*;

public class GLRenderer implements GLSurfaceView.Renderer{
	public GLRenderer(){
		mTriangle = new Triangle();
	}
	// Renderer implements
	//-------------------------------
	@Override
	public void onDrawFrame(GL10 gl){
		// Display Clear
		gl.glClearColor(1.0f,1.0f,0, 0);
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
		
		// model mode
		gl.glMatrixMode(GL10.GL_MODELVIEW);
		gl.glLoadIdentity();
		
		// move view point
		gl.glTranslatef(0, 0, -1.5f);
		
		// draw triangle 
		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
		gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
		mTriangle.draw(gl);
	}
	
	@Override
	public void onSurfaceChanged(GL10 gl, int width, int height){
		// set viewport
		gl.glViewport(0, 0, width, height);
		// frustum rendering area in perspective projection system
		float ratio = (float) width/ height;
		gl.glMatrixMode(GL10.GL_PROJECTION);
		gl.glLoadIdentity();
		gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
	}
	
	@Override
	public void onSurfaceCreated(GL10 gl, EGLConfig config){
		
	}
	
	private Triangle mTriangle;
}

三角形。

import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.nio.ByteOrder;
import javax.microedition.khronos.opengles.*;

public class Triangle{
	public Triangle(){
		// set vertices and colors
		int one = 0x10000;
		int vertices[] ={
				-one,0,0, // left
				one,0,0, // right
				0,one,0 // top
		};
		int colors[]={
				one,0,0,one, // red
				0,one,0,one, // green
				0,0,one,one // blue
		};
		byte indices[]={
				0,1,2
		};
		
		// prepare vertex
		ByteBuffer vertexBuffer = ByteBuffer.allocateDirect(vertices.length*4);
		vertexBuffer.order(ByteOrder.nativeOrder());
		mVertexBuffer = vertexBuffer.asIntBuffer();
		mVertexBuffer.put(vertices);
		mVertexBuffer.position(0);
		
		// prepare color
		ByteBuffer colorBuffer = ByteBuffer.allocateDirect(colors.length*4);
		colorBuffer.order(ByteOrder.nativeOrder());
		mColorBuffer = colorBuffer.asIntBuffer();
		mColorBuffer.put(colors);
		mColorBuffer.position(0);
		
		// prepare index
		mIndexBuffer = ByteBuffer.allocateDirect(indices.length);
		mIndexBuffer.put(indices);
		mIndexBuffer.position(0);
	}
	
	public void draw(GL10 gl){
		// Culling
		gl.glFrontFace(GL10.GL_CW);
		// set Vertex
		gl.glVertexPointer(3, GL10.GL_FIXED, 0, mVertexBuffer);
		// set Color
		gl.glColorPointer(4, GL10.GL_FIXED, 0, mColorBuffer);
		// draw
		gl.glDrawElements(GL10.GL_TRIANGLES, 3, GL10.GL_UNSIGNED_BYTE, mIndexBuffer);
	}
	private IntBuffer mVertexBuffer;
	private IntBuffer mColorBuffer;
	private ByteBuffer mIndexBuffer;
}

こんな風に表示されるよ。