android 中的openGL使用学习笔记
来源:互联网 发布:linux网络代理服务器 编辑:程序博客网 时间:2024/05/21 15:44
关于openGL的介绍网上随便搜搜就有,这里就不再介绍了。本文主要说一下openGL在android中的初步使用。
在andorid中我们需要通过GLSurfaceView来将openGL视图显示在Activity中。而GLSurfaceView需要一个实现了Renderer接口的类来渲染视图。接下来我们就来构建一个自己的Renderer类:
首先,新建一个实现了Renderer接口的类取名MyRenderer,并重写如下方法
//绘制当前屏幕的代码写在此方法中 public void onDrawFrame(GL10 gl) {}// 当屏幕大小改变时被调用public void onSurfaceChanged(GL10 gl, int width, int height){}//当窗口被创建时被调用,进行一些初始化工作 public void onSurfaceCreated(GL10 gl, EGLConfig config){}
onSurfaceCreated方法会在窗口被创建时调用,通常我们在此方法中对openGL做一些初始化工作,比如
// 启用阴影平滑 gl.glShadeModel(GL10.GL_SMOOTH); // 设置背景为黑色(rgba) gl.glClearColor(0, 0, 0, 0); // 设置深度缓存几乎所有在屏幕上显示3D场景OpenGL程序都使用深度缓存。它的排序决定那个物体先画, //启用深度缓存可以让 OpenGL知道绘制在场景中的物体的深度关系,这样我们绘制物体时, //就不会将后面的物体绘制到前面的物体上来。 gl.glClearDepthf(1.0f); // 启用深度测试 gl.glEnable(GL10.GL_DEPTH_TEST); // 所作深度测试的类型 gl.glDepthFunc(GL10.GL_LEQUAL); // 告诉系统对透视进行修正 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);当窗口的场景大小发生改变时会调用onSurfaceChanged方法,我们在此方法中调用gl.glViewport(0, 0, width, height)来设置openGL的场景大小。并通过如下代码来使openGL绘制物体时有透视的效果
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();
在onDrawFrame方法中写绘图所用的具体代码,通在常此方法中先清除屏幕缓存和深度缓存并重置矩阵
//清除深度缓存gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); //重置矩阵gl.glLoadIdentity();想要绘图我们还需要通过glVertexPointer(int size,int type,int stride,Buffer pointer)方法来告诉openGL所要绘制的图形的顶点数据,例如绘制一个三角形我们可以定义顶点坐标如下:
private float vertex[] = { 0.0f, 1.0f,0.0f, //上顶点 -1.0f,-1.0f,0.0f, //左下点 1.0f,-1.0f,0.0f, //右下点};
方法中的参数size表示点的维度,type描述顶点的类型,stride描述顶点与顶点间的字节偏移量,pointer是存放顶点坐标数据
的缓存引用,在openGL中为了提高效率,glVertexPointer仅接受与语言无关的本地缓冲区,而不是java浮点数组,
因此我们需要使用java.nio类将浮点数组转换为本地缓冲区。
步骤如下:
ByteBuffer tbb = ByteBuffer.allocateDirect(vertex.length * 4);//4表示每个浮点数占4个字节tbb.order(ByteOrder.nativeOrder());TrianBuffer = tbb.asFloatBuffer();TrianBuffer.put(vertex);TrianBuffer.position(0);
设置好了顶点数组,我们就可以通过 glDrawArrays(int mod e,int f irst,int count) 函数将这些顶点绘制出来,
mode描述了绘制模式,指定它为GLTRIANGLES来表示绘制三角形:
绘制前需要通过gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);启用顶点数组,绘制完后记得要调用gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);关闭
接下来我们需要在Activity的onCreate方法中将openGL绘制的视图显示出来,步骤如下:
先创建一个GLSurfaceView对象glview,然后调用glview.setRenderer(render);此处的render引用即为我们刚刚所创建的MyRenderer类的实例对象。
最后调用setContentView(glview)方法;
未完待续------
- android 中的openGL使用学习笔记
- Android OpenGL学习笔记
- Android OpenGL 学习笔记
- Android OpenGL 学习笔记
- Android OpenGL学习笔记(一)
- Android OpenGL学习笔记(一)
- Android OpenGL 学习笔记 01
- Android OpenGL ES学习笔记之实现OpenGL ES接口
- Android OpenGL 学习笔记 --开始篇
- android OpenGL学习笔记(一)
- Android的OpenGL学习笔记(1)
- Android的OpenGL学习笔记(2)
- Android的OpenGL学习笔记(3)
- Android的OpenGL学习笔记(4)
- Android的OpenGL学习笔记(5)
- Android的OpenGL学习笔记(6)
- Android OpenGL 学习笔记 --开始篇
- Android OpenGL 学习笔记 --开始篇
- 任正非演讲系列之——华为的冬天
- 网站建设
- LFS学习(6)安装工具链
- YYXT之IT工作小记(二)
- matlab读取txt
- android 中的openGL使用学习笔记
- * ++ 的优先级
- 深入理解iputils网络工具-第4篇 tracepath:路由追踪程序
- 【并查集】黑魔法师之门
- 【分享】HTML转换为PDF工具v1.0
- 再来一个一键关闭所有程序的小代码
- java基础_时间:2012/8/19 星期日 20:24
- [重构]Feature Envy
- 一道有趣的木板问题