OpenGL(Android)
来源:互联网 发布:三国 知乎 编辑:程序博客网 时间:2024/06/05 04:53
opengl简单用法(一)
最近在学习opengl,一路心酸溢于言表,(哭泣中)
首先让我们认识认识opengl是什么东东
opengl就是一个3D图形库,所以你想在安卓手机上绘制一个炫酷的3D图形用opengl来实现就方便得多了。
由于学习opengl不久,今天就用opengl来绘制一个简单的三角形和矩形.
code之前先让我们看看opengl绘制图形比较重要的几个类
GLSurfaceView,其实就是一个view,用来装载你绘制的图形的,一般会继承这个类添加一些额外的东西(比如添加一些监听事件)
GLSurfaceView.Renderer,这是一个非常重要的类,哦呸,是接口,里面有三个函数,可以说是三个生命周期函数。
1、onSurfaceCreated:当GLSurfaceView被创建的时候调用,按道理讲只会被调用一次,所以一般在这个函数中初始化一些数据和基本设置
2、onSurfaceChanged:当View发生改变的时候会被调用,刚开始view的宽高都是0,然后占满整个屏幕,所以GLSurfaceView被创建时调用一次,当屏幕发生变化时也会被调用(比如屏幕从竖屏变为横屏)
3、onDrawFrame:这个函数非常重要,图形的绘制都在这个函数中进行,这就意味着这个函数会被回调很多次,可以设置函数的调用时机(手动调用和自动调用)
RENDERMODE_CONTINUOUSLY:自动调用
RENDERMODE_WHEN_DIRTY:手动调用,GLSurfaceView.setRenderMode(int mode),设置,GLSurfaceView.requestRender()实现手动刷新
绘制三角形:
public class GLTriensRender implements GLSurfaceView.Renderer {
//初始化绘制的三角形的坐标数组
private float[] verts = new float[]{0f, 1f, 0f,
-1f, -1f, 0f,
1f, -1f, 0f};
//定义三角形顶点的缓存
private FloatBuffer mVertsBuffer;
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColorx(0, 0, 0, 1);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//注意,必须要用ByteBuffer来初始化FloatBuffer
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(verts.length * 4);
byteBuffer.order(ByteOrder.nativeOrder());
mVertsBuffer = byteBuffer.asFloatBuffer();
mVertsBuffer.put(verts);
mVertsBuffer.position(0);
}
@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); float ratio = (float) width / height; //切换到投影模式 gl.glMatrixMode(GL10.GL_PROJECTION); //重置视图矩阵 gl.glLoadIdentity(); //设置视图的范围 gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); //设置到视图模式 gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity();}@Overridepublic void onDrawFrame(GL10 gl) { //清除颜色和深度缓存 gl.glClear(GL10.GL_DEPTH_BUFFER_BIT | GL10.GL_COLOR_BUFFER_BIT); gl.glLoadIdentity(); gl.glTranslatef(-1.5f,0f,-6f); gl.glColor4f(1f,0f,0f,0f); gl.glVertexPointer(3,GL10.GL_FLOAT,0,mVertsBuffer); gl.glDrawArrays(GL10.GL_TRIANGLES,0,3); gl.glFinish();}
}
public class OpenGLView extends GLSurfaceView{
private GLTriensRender renderer;
public OpenGLView(Context context) {
super(context);
renderer = new GLTriensRender();
setRenderer(renderer);
requestLayout();
}
}
我们可以看到出现了一个红色的三角形.
绘制矩形就得定义一个矩形的数组
private float[] verts = new float[]{-1f, -1f, 0f,
1f, -1f, 0f,
-1f, 1f, 0f,
1f, 1f, 0f};
注意顺序很重要:左下、右下、左上、右上
gl.glDrawArrays(GL10.GL_TRIANGLES,0,3)改成gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);就能看到一个红色的矩形
继续学习中,后面还会出更多的学习心得!
- OpenGL(Android)
- Android图形---OpenGL(一)
- Android图形---OpenGL(二)
- Android图形---OpenGL(三)
- Android图形---OpenGL(四)
- Android图形---OpenGL(五)
- Android图形---OpenGL(六)
- Android图形---OpenGL(一)
- Android OpenGL 学习(一)
- android opengl
- android opengl
- Android OpenGL
- Android-OpenGL
- Android OpenGL
- Android:OpenGL
- Android OpenGL
- Android OpenGL ES(一):关于OpenGL ES
- Android OpenGL ES(二):OpenGL ES管道(Pipeline)
- 复合索引如何用
- wamp 服务器没有响应(或本地服务器的套接字没有正确设置) wamp 正常启动 能访问localhost
- java 面试 2013年
- 1.1.单片机的初步理解
- [zookeeper]联接中断,watch恢复,心跳和客户端超时
- OpenGL(Android)
- JAVA每日总结
- POJ - 3767 - I Wanna Go Home
- 1.2.第一个实验——点亮LED灯
- c++上机报告4
- String字符串转成键值对形式存储于Map(拆分字段)
- 使用Block实现页面传值
- 日期的统一处理
- 归并排序-非递归版