openGL——在Android中使用openGL来画一个三角形


package com.example.opengl1;

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;
import android.opengl.GLU;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Menu;

/**
 * 以下这个demo实现了画一个红色的三角形
 * @author pc
 *
 */
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		MyGLSurfaceView view = new MyGLSurfaceView(this);
		//renderer: 渲染器..
		view.setRenderer(new MyRenderer());
		
		setContentView(view);
	}

	class MyGLSurfaceView extends GLSurfaceView{
		public MyGLSurfaceView(Context context) {
			super(context);
		}
		
		public MyGLSurfaceView(Context context,AttributeSet attrs) {
			super(context, attrs);
		}
	}
	
	//自定义渲染器
	class MyRenderer implements GLSurfaceView.Renderer{
		
		//表层创建时
		@Override
		public void onSurfaceCreated(GL10 gl, EGLConfig config) {
			//设置清屏色
			gl.glClearColor(0, 0, 0, 1);
			//启用顶点缓冲区
			gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
		}
		
		//表层size时
		@Override
		public void onSurfaceChanged(GL10 gl, int width, int height) {
			//红色纸视口,输出画面的区域
			gl.glViewport(0, 0, width, height);
			
			float ratio = (float)width/(float)height;
			
			//矩阵模式,投影矩阵,openGL基于状态机
			gl.glMatrixMode(GL10.GL_PROJECTION);
			//加载单位矩阵
			gl.glLoadIdentity();
			//平截头体(最后一个f表示他是浮点数的类型)
			gl.glFrustumf(-1f, 1f, -ratio, ratio, 3, 7);
			
		}
		
		//绘图
		@Override
		public void onDrawFrame(GL10 gl) {
			gl.glClear(GL10.GL_COLOR_BUFFER_BIT);//清除颜色缓冲区
			
			//模型视图矩阵
			gl.glMatrixMode(gl.GL_MODELVIEW);
			gl.glLoadIdentity();
			
			// eyeX, eyeY, eyeZ: 放置眼球的坐标
			// centerX, centerY, centerZ,: 眼球的观察点.(在这里只要比5小就行了,如果大于5的话,就会看到的是黑屏)
			// upX, upY, upZ: 指定眼球向上的向量
//			GLU.gluLookAt(gl, eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ)
			GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0,1,0);
			
			/**
			 * 画三角形
			 * 绘制数组
			 * 三角形坐标
			 */
			float[] coords = {
					0f,0.5f,0f,
					-0.5f,-0.5f,0f,
					0.5f,-0.5f,0f,
			};
			
			//分配字节缓冲区控件,存放顶点坐标数据
			ByteBuffer ibb = ByteBuffer.allocateDirect(coords.length * 4);
			ibb.order(ByteOrder.nativeOrder());//设置顺序(本地顺序)
			FloatBuffer fbb = ibb.asFloatBuffer();//放置顶点坐标数组
			fbb.put(coords);
			ibb.position(0);//定位指针的位置,从该位置开始读取顶点数据
			
			gl.glColor4f(1f, 0f, 0f, 1f);//设置绘图时的颜色
			
			/**
			 * 3: 3维坐标,使用3个坐标值表示一个点
			 * type: 每个点的数据类型
			 * stride: 0,跨度
			 * ibb: 指定定点缓冲区
			 */
			gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ibb);
			gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);//绘制三角形.这3个参数分别为:需要画的数据的类型,从哪一个点开始画,需要画的点的个数
			
		}
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


你可能感兴趣的:(openGL)