1、先新建一个Android项目
2、建一个类 MySurfaceView
public class MySurfaceView extends GLSurfaceView {
//只是一个载体
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MySurfaceView(Context context) {
super(context);
}
}
3、建一个抽象类 MyAbstractRenderer
public abstract class MyAbstractRenderer implements Renderer {
//表层创建
public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
//设置清屏色(背景)
gl.glClearColor(0, 0, 0, 1);
//启用顶点缓冲区
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}
//表层size改变
public void onSurfaceChanged(GL10 gl, int width, int height) {
//openGL基于状态机
/*单位矩阵
* [1,0,0,0]
* [0,1,0,0]
* [0,0,1,0]
* [0,0,0,1]
*/
//视口
gl.glViewport(0, 0, width, height);
//矩阵模式
//透视投影:有深度 (投影矩阵)
//正投影:没有深度
gl.glMatrixMode(GL10.GL_PROJECTION);//(投影矩阵)
//原则:在操作矩阵前先加载单位矩阵 然后才干别的事情
//将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
gl.glLoadIdentity();
//平截头体
//左侧(宽高比),右侧(宽高比),下侧,上侧,近平面、远平面
float ratio=(float)width/(float)height;
gl.glFrustumf(-ratio, ratio,-1f, 1f, 3, 7);
}
/*
*绘图
* 在子线程运行
*/
public void onDrawFrame(GL10 gl) {
this.drawBefore(gl);
//模型视图矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
//eyex,eyey,eyez 放置眼球的坐标
//centerx,centery,ceterz眼球的观察点
//upx,upy,upz 指定眼球向上的向量
GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0, 1, 0);
this.draw(gl);
}
/*
* 绘图
* 参数的基本设置
*/
protected void drawBefore(GL10 gl) {
//清除颜色缓冲区
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
//设置绘图的颜色
gl.glColor4f(1f, 0, 0, 1f);
}
//子类实现绘图的方法
protected abstract void draw(GL10 gl);
}
4、做一个工具类来实现数组转字节数组的方法
public class BufferUtil {
public static ByteBuffer arr2ByteBuffer(float[] arr){
//分配字节缓冲区空间,存放顶点坐标
//float 为4个字节
ByteBuffer ibb=ByteBuffer.allocateDirect(arr.length*4);
//设置顺序(本地数据)
ibb.order(ByteOrder.nativeOrder());
//放置顶点坐标数组
FloatBuffer fbb=ibb.asFloatBuffer();
fbb.put(arr);
//定位指针位置,从该位置开始读取顶点数据
ibb.position(0);
return ibb;
}
public static ByteBuffer list2ByteBuffer(List<Float> list){
ByteBuffer ibb=ByteBuffer.allocateDirect(list.size()*4);
ibb.order(ByteOrder.nativeOrder());
FloatBuffer fbb=ibb.asFloatBuffer();
for (Float f : list) {
fbb.put(f);
}
ibb.position(0);
return ibb;
}
}
5、绘制三角形
public class MyTrianglesRenderer extends MyAbstractRenderer {
/*
* 绘制三角形
*/
protected void draw(GL10 gl) {
float [] dots={
0,0.5f,0,
-0.5f,-0.5f,0,
0.5f,-0.5f,0
};
ByteBuffer ibb=BufferUtil.arr2ByteBuffer(dots);
//3:表示三维点(x,y,z)
//type:GL10.GL_FLOAT 每个点是什么数据类型
//stride:0 跨度
//ibb ,顶点缓冲区
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ibb);
//画三角形
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}
}
6、整合运行程序
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MySurfaceView view=new MySurfaceView(this);
MyAbstractRenderer renderer=new MyTrianglesRenderer();
view.setRenderer(renderer);
setContentView(view);
}
}