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; }