OpenGL ES开发绘制2D图形
来源:互联网 发布:瓦拉内fifa数据 编辑:程序博客网 时间:2024/04/30 13:40
package com.example.tyxiong.myapplication;import android.app.Activity;import android.opengl.GLSurfaceView;import android.os.Bundle;import android.view.View;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.FloatBuffer;import java.nio.IntBuffer;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL10;/*OpenGL与3D开发.*2句概述:* OpenGL是跨平台,跨语言的开放图形库接口. 主要是用于3D图形开发.* Android系统内置了OpenGL ES支持. OpenGL ES是OpenGL的子集.--只支持绘制三角形* 对于2D(平面)的三角形而言,由三个点构成,每个点的坐标由(x,y)值构成.三个顶处理同一平面上.只需要提供每个顶点的坐标值即可* 对于3D(立体)的三棱锥而言,由4个顶点构成,每个顶点的坐标由(x,y,x)值构成,各顶点不在同一平面,需要提供2方面数据:1 3D图形每个顶点的坐标值. 2 3D图形每个平面由哪些顶点组成.** 三维坐标系:与数学里坐标系相同(屏幕中心点为坐标原点)** Android5.0支持OpenGL ES3.1 android有opengl包, 3工具类:GLSurfaceView GLU GLUtils 功能强大.** OpenGL ES绘制2D图形:* GLSurfaceView组件用于显示3D图形,其中GLSurfaceView.Renderer来完成绘制SurfaceView中的3D图形. 使用分3步:* 1 创建GLSurfaceView组件,并用Activity显示.* 2 创建GLSurfaceView.Renderer接口的子类实例--实现3个方法(方法中有GL10参数 表示画笔)* 2-1 onSurfaceCreate()--Surface被创建时回调,方法内常进行初始化GL10参数.* 2-2 onSurfaceChanged()--Surface被改变回调,常进行3D场景的设置.* 2-3 onDrawFrame()--代表绘制的当前帧,绘制3D图形.* 3 调用GLSurfaceView的setRenderer()方法来指定Renderer对象.** 调用GL10绘制2D图形的步骤 6步: 只需要提供所有顶点的坐标值.* 1 glEnableClientState(GL10.GL_VERTEX_ARRAY)启用顶点数组.* 2 glEnableClientState(GL10.GL_COLOR_ARRAY)启动顶点颜色数组* 3 glVertexPointer(size,type,stride,pointer)设置顶点坐标值. 每个顶点的值组成元素个数3 值类型int/fix float 步幅0 坐标值数据(一维形如x1,y1,z1)* 4 glColorPointer(size,type,stride,pointer) 设置顶点颜色值.(rgbn)4* 5 glDrawArrays(mode,first,count)绘制2D图形(平面) GL10.GL_TRIANGLES三角形/GL10.GL_TRIANGLE_STRIP多三角形. 开始顶点 顶点总数. * 6 glFinish()结束绘制,glDisableClientState(int)停用顶点坐标和颜色数据.****** * */public class MainActivity extends Activity { GLSurfaceView surfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); surfaceView = new GLSurfaceView(this); final MyRenderer myRenderer = new MyRenderer(); surfaceView.setRenderer(myRenderer); surfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);//绘制静图,无须刷新需要重绘时requestRenderer()节省cpu setContentView(surfaceView); surfaceView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { surfaceView.requestRender();//请求执行onDrawFrame() } }); }}class MyRenderer implements GLSurfaceView.Renderer { float[] rectData = new float[]//顶点坐标数据 左上,右上,左下,右下 { -2f, 2f, 0f, 2f, 2f, 0f, -2f, -2f, 0f, 2f, -2f, 0f }; int[] rectColor = new int[]//rgbn顶点的颜色值 { 65535, 0, 0, 0, 0, 65535, 0, 0, 0, 0, 65535, 0, 0, 65535, 65535, 0 }; private float angle=0f; public FloatBuffer floatUtils(float[] floatArr) {//绘制方法要求数据为Buffer类型 float[]-->FloatBuffer[] ByteBuffer byteBuffer = ByteBuffer.allocateDirect(floatArr.length * 4);//要求用allocateDirect()方法,只有ByteBuffer有该方法,so byteBuffer.order(ByteOrder.nativeOrder()); //要求nativeOrder Java 是大端字节序(BigEdian), // 而 OpenGL 所需要的数据是小端字节序(LittleEdian) FloatBuffer floatBuffer = byteBuffer.asFloatBuffer(); floatBuffer.put(floatArr); floatBuffer.flip(); return floatBuffer; } public IntBuffer intUtils(int[] intArr) { ByteBuffer byteBuffer = ByteBuffer.allocateDirect(intArr.length * 4); byteBuffer.order(ByteOrder.nativeOrder()); IntBuffer intBuffer = byteBuffer.asIntBuffer(); intBuffer.put(intArr); intBuffer.flip(); return intBuffer; } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) {//对GL设置参数 关闭抗抖动 设置透视修正模式 // 清屏黑色 平滑 开启深度测试 深度测试类型. gl.glDisable(GL10.GL_DITHER); gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); gl.glClearColor(0, 0, 0, 0); gl.glShadeModel(GL10.GL_SMOOTH); gl.glEnable(GL10.GL_DEPTH_TEST); gl.glDepthFunc(GL10.GL_LEQUAL); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) {//3D视窗场景 视窗大小位置 投影矩阵 // 重置绘制坐标原点 透视视窗宽高比 透视视窗空间大小 gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL10.GL_PROJECTION);//距离越远,小 映射坐标系设置为"投影矩阵" gl.glLoadIdentity(); float ratio = (float) width / height; gl.glFrustumf(-ratio, ratio, -1f, 1f, 1f, 10f);//三维坐标系的值不是直接取屏幕像素,是根据该方法 // 设置空间大小范围内可见最后2个参数为绝对值. } @Override public void onDrawFrame(GL10 gl) {//绘制当图形 清除屏幕缓存深度缓存 开启顶点数据 顶点颜色 设置顶点数据 // 颜色数据 绘制2D图形 绘制完成 关闭顶点&&颜色数据 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL10.GL_MODELVIEW);//需要绘图时设置为"模型视图" gl.glLoadIdentity(); gl.glTranslatef(0f,0f,-5f);//改变绘图坐标原点 gl.glRotatef(angle++,0f,0f,0.1f);//旋转 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY); FloatBuffer pointerData = floatUtils(rectData); IntBuffer pointColor = intUtils(rectColor); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, pointerData); gl.glColorPointer(4, GL10.GL_FIXED, 0, pointColor); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); gl.glFinish(); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_COLOR_ARRAY); }}
0 0
- OpenGL ES开发绘制2D图形
- OpenGL ES绘制3D图形
- OpenGL ES绘制3D图形
- OpenGL ES绘制3D图形
- OpenGL ES绘制3D图形
- OpenGL ES绘制3D图形
- OpenGL ES绘制3D图形
- OpenGL ES 绘制 3D 图形
- OpenGL ES绘制3D图形
- OpenGL ES 绘制 3D 图形
- Android OpenGL ES 3D图形绘制
- 使用OpenGL ES绘制3D图形
- OpenGL ES 绘制 3D 图形
- OpenGL ES绘制3D图形
- opengl|es - 2D绘制
- opengl|es - 2D绘制
- android studio | openGL es 3.0增强现实(AR)开发 (4) 绘制简单的2D图形、显示、旋转
- 初学Android,OpenGL ES之绘制3D图形(八十二)
- 对于初学者有所帮助,java随机产生双色球
- Linux文件压缩tar
- maven 插件和生命周期
- STM32-通用定时器基本定时功能
- CSS3背景探讨
- OpenGL ES开发绘制2D图形
- PATbasic1001害死人不偿命的(3n+1)猜想
- Android Service完全解析,关于服务你所需知道的一切
- 双重指针做参数传递
- linux系统上FTP使用
- Softlockup分析
- mysql查询注释信息
- python signal
- 判断字符串中是否有重复字母