1. 基本框架
    编写一个类来继承GLSurfaceView.Renderer,并实现其中的三个方法onSurfaceCreated、onSurfaceChanged、onDrawFrame。

/*** 基本框架* Created by mazaiting on 2017/8/9.*/
public class GLRenderer implements GLSurfaceView.Renderer {/*** 在窗口被创建时被调用,需要做一些必要的初始化工作:*/@Override public void onSurfaceCreated(GL10 gl, EGLConfig config) {// 启动阴影平滑gl.glShadeModel(GL10.GL_SMOOTH);// 黑色背景,设置清楚屏幕时所用的颜色取值:RGBA.0f-1.0fgl.glClearColor(0, 0, 0, 1.0f);// 设置深度缓存--决定哪个物体先画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);}/*** 当窗口大小发生改变时被调用,不管窗口的大小是否已经改变,在程序开始时至少运行一次。*/@Override public void onSurfaceChanged(GL10 gl, int width, int height) {float ratio = (float) width / height;// 设置OpenGL场景的大小gl.glViewport(0, 0, width, height);// 设置投影矩阵--增加透视gl.glMatrixMode(GL10.GL_PROJECTION);// 重置投影矩阵--恢复原始状态gl.glLoadIdentity();// 设置视图的大小gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);// 选择模型观察矩阵gl.glMatrixMode(GL10.GL_MODELVIEW);// 重置模型观察矩阵gl.glLoadIdentity();}/*** 在窗口内进行绘图操作。 在绘图之前,需要将屏幕清楚成前面指定的颜色,清楚深度缓存并且重置场景*/@Override public void onDrawFrame(GL10 gl) {// 清楚屏幕和深度缓存gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 重置当前的模型观察矩阵gl.glLoadIdentity();// 具体绘图开始...}/*** OpenGL 是一个非常底层的画图接口,它所使用的缓冲区存储结构是和我们的 java 程序中不相同的。* Java 是大端字节序(BigEdian),而 OpenGL 所需要的数据是小端字节序(LittleEdian)。* 所以,我们在将 Java 的缓冲区转化为 OpenGL 可用的缓冲区时需要作一些工作。建立buff的方法如下**/public Buffer bufferUtil(int []arr){// 先初始化buffer,数组的长度*4,因为一个int占4个字节ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length * 4);// 数组排列用nativeOrderqbb.order(ByteOrder.nativeOrder());// 将ByteBuffer转换为IntBufferIntBuffer mBuffer = qbb.asIntBuffer();// 将数组设置进去mBuffer.put(arr);//mBuffer.position(0);// 重置mBuffer.flip();return mBuffer;}
}

其中都是一些具体的配置,在主Activity中,我们首先创建出一个GLRenderer对象 ,并创建GLSurfaceView对象,将GLRenderer对象设置在GLSurfaceView对象中。、


public class MainActivity extends AppCompatActivity {@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 基础框架GLSurfaceView.Renderer renderer = new GLRenderer();GLSurfaceView glView = new GLSurfaceView(this);glView.setRenderer(renderer);// 设置布局setContentView(glView);}
}

至此,我们将OpenGL开发时所要做的配置已完成,接下来我们在写新的Renderer时,只需要继承在GLRenderer,重写onDrawFrame(GL10 gl)方法即可。

  1. 绘制多边形
    实现此类后,要想看到效果,务必将主AcitivityGLSurfaceView.Renderer renderer = new GLRenderer();的此行代码更改为GLSurfaceView.Renderer renderer = new PolygonRenderer();
/*** 绘制多边形* Created by mazaiting on 2017/8/9.*/
public class PolygonRenderer extends GLRenderer{int one = 0x00010000;//三角形三个顶点private int[] triggerBuffer = new int[] {0, one, 0,//上顶点- one, -one, 0, //左下点one, -one, 0,}; //右下点//正方形的4个顶点private int[] quaterBuffer = new int[]{one,one,0,-one,one,0,one,-one,0,-one,-one,0};@Override public void onDrawFrame(GL10 gl) {super.onDrawFrame(gl);// 此函数,就是将画笔沿X轴左移1.5f个单位,Y轴保持不变,Z轴向屏幕里面移动6.0f个单位。//gl.glTranslatef(-1.5f, 0.0f, -6.0f);// 左移 1.5 单位,并移入屏幕 6.0gl.glTranslatef(-1.5f, 0.0f, -6.0f);// z 轴值小于-1.0f// 允许设置顶点gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);// 设置三角形gl.glVertexPointer(3, GL10.GL_FIXED, 0, bufferUtil(triggerBuffer));// 绘制三角形gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);// 重置当前模型观察矩阵gl.glLoadIdentity();// 右移 1.5 单位,并移入屏幕 6.0gl.glTranslatef(1.5f, 0.0f, -6.0f);// z 轴值小于-1.0f// 设置四边形gl.glVertexPointer(3,GL10.GL_FIXED,0,bufferUtil(quaterBuffer));// 绘制四边形gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);//取消顶点设置gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);// 重置当前的模型观察矩阵gl.glLoadIdentity();}
}

效果图:

绘制多边形.png

  1. 绘制颜色
    实现此类后,要想看到效果,务必将主AcitivityGLSurfaceView.Renderer renderer = new GLRenderer();的此行代码更改为GLSurfaceView.Renderer renderer = new ColorRenderer();
/*** 绘制颜色* Created by mazaiting on 2017/8/9.*/
public class ColorRenderer extends GLRenderer {int one = 0x10000;//三角形三个顶点 (r,g,b,a)private int[] triggerBuffer = new int[] {0, one, 0,//上顶点- one, -one, 0, //左下点one, -one, 0,}; //右下点//正方形的4个顶点private int[] quaterBuffer = new int[]{one,one,0,-one,one,0,one,-one,0,-one,-one,0};//三角形的顶点颜色值(r,g,b,a)private int[] colorBuffer = new int[]{one,0,0,one,0,one,0,one,0,0,one,one,};@Override public void onDrawFrame(GL10 gl) {super.onDrawFrame(gl);// 左移 1.5 单位,并移入屏幕 6.0gl.glTranslatef(-1.5f,0.0f,-6.0f);//设置定点数组gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//设置颜色数组 -- 开启颜色渲染功能.gl.glEnableClientState(GL10.GL_COLOR_ARRAY);// 设置三角形顶点的颜色gl.glColorPointer(4,GL10.GL_FIXED,0,bufferUtil(colorBuffer));// 设置三角形顶点gl.glVertexPointer(3,GL10.GL_FIXED,0,bufferUtil(triggerBuffer));gl.glDrawArrays(GL10.GL_TRIANGLES,0,3);//关闭颜色数组 -- 关闭颜色渲染功能.gl.glDisableClientState(GL10.GL_COLOR_ARRAY);gl.glLoadIdentity();// 右移 1.5 单位,并移入屏幕 6.0gl.glTranslatef(1.5f,0.0f,-6.0f);// 设置当前色为蓝色gl.glColor4f(0.0f,0.5f,1.0f,1.0f);//设置和绘制正方形gl.glVertexPointer(3,GL10.GL_FIXED,0,bufferUtil(quaterBuffer));gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);//取消顶点数组gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);}
}

效果图:

绘制颜色.png

  1. 绘制旋转
    实现此类后,要想看到效果,务必将主AcitivityGLSurfaceView.Renderer renderer = new GLRenderer();的此行代码更改为GLSurfaceView.Renderer renderer = new RotateRenderer();
/*** 绘制旋转图形* Created by mazaiting on 2017/8/9.*/
public class RotateRenderer extends GLRenderer {int one = 0x00010000;//三角形三个顶点private int[] triggerBuffer = new int[] {0, one, 0,//上顶点- one, -one, 0, //左下点one, -one, 0,}; //右下点@Override public void onDrawFrame(GL10 gl) {super.onDrawFrame(gl);gl.glTranslatef(-1.5f,0.0f,-6.0f);gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glRotatef(180f,0,0,0);//旋转180gl.glVertexPointer(3,GL10.GL_FIXED,0,bufferUtil(triggerBuffer));gl.glDrawArrays(GL10.GL_TRIANGLES,0,3);gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);gl.glLoadIdentity();}
}

效果图:

绘制旋转.png

  1. 绘制三棱锥
    实现此类后,要想看到效果,务必将主AcitivityGLSurfaceView.Renderer renderer = new GLRenderer();的此行代码更改为GLSurfaceView.Renderer renderer = new PyramidRenderer();
/*** 四棱锥* Created by mazaiting on 2017/8/9.*/public class PyramidRenderer extends GLRenderer {int one = 0x10000;// 四棱锥顶点数组:private int[] triggerBuffer = new int[] {0, one, 0,-one, -one, one,one, -one, one,0,one, 0,one,-one, one,one, -one, -one,0, one, 0,one, -one, -one,-one, -one, -one,0, one, 0,-one, -one, -one,-one, -one, one};/*** Every vertex has got its own color, described by 4 values* R(ed)* G(green)* B(blue)* A(lpha)*/int colors[] = {0, 0, 0, one, one, 0, 0, one, one, one, 0, one, 0, one, 0, one, 0, 0, one, one, one, 0, one,one, one, one, one, one, 0, one, one, one,};/*** The last thing is that we need to describe some Triangles.* A triangle got 3 vertices.* The confusing thing is, that it is important in which order* the vertices of each triangle are described.* So describing a triangle through the vertices: "0, 4, 5"* will not result in the same triangle as: "0, 5, 4"* You probably ask: Why the hell isn't that the same ???* The reason for that is the call of: "gl.glFrontFace(gl.GL_CW);"* which means, that we have to describe the "visible" side of the* triangles by naming its vertices in a ClockWise order!* From the other side, the triangle will be 100% lookthru!* You can create a kind of magic mirror with that**/byte indices[] = {0, 4, 5, 0, 5, 1, 1, 5, 6, 1, 6, 2, 2, 6, 7, 2, 7, 3, 3, 7, 4, 3, 4, 0, 4, 7, 6, 4, 6, 5, 3,0, 1, 3, 1, 2};@Override public void onSurfaceChanged(GL10 gl, int width, int height) {super.onSurfaceChanged(gl, width, height);// 设置透视范围GLU.gluPerspective(gl, 45.0f, ((float) width) / height, 0.1f, 10f);}float xRot = 0.0f;float yRot = 0.0f;@Override public void onDrawFrame(GL10 gl) {super.onDrawFrame(gl);gl.glMatrixMode(GL10.GL_MODELVIEW);// 切换至模型观察矩阵gl.glLoadIdentity();// 重置当前的模型观察矩阵GLU.gluLookAt(gl, 0f, 0f, 3f, 0f, 0f, 0f, 0f, 1f, 0f);//设置视点和模型中心位置gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glVertexPointer(3, GL10.GL_FIXED, 0, bufferUtil(triggerBuffer));gl.glRotatef(xRot,1f,0f,0f);// 绕着(0,0,0)与(1,0,0)即x轴旋转gl.glRotatef(yRot,0f,1f,0f);gl.glColor4f(1.0f,0.0f,0.0f,1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3);gl.glColor4f(0.0f,1.0f,0.0f,1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 3, 3);gl.glColor4f(0.0f,0.0f,1.0f,1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 6, 3);gl.glColor4f(1.0f,0.0f,1.0f,1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 9, 3);xRot += 1.0f;yRot += 0.5f;}
}

效果图:

三棱锥.png

  1. 绘制正方体
    实现此类后,要想看到效果,务必将主AcitivityGLSurfaceView.Renderer renderer = new GLRenderer();的此行代码更改为GLSurfaceView.Renderer renderer = new CubeRenderer();

/*** 绘制正方体* Created by mazaiting on 2017/8/10.*/
public class CubeRenderer extends GLRenderer{float box[] = new float[] {// FRONT-0.5f, -0.5f,  0.5f,0.5f, -0.5f,  0.5f,-0.5f,  0.5f,  0.5f,0.5f,  0.5f,  0.5f,// BACK-0.5f, -0.5f, -0.5f,-0.5f,  0.5f, -0.5f,0.5f, -0.5f, -0.5f,0.5f,  0.5f, -0.5f,// LEFT-0.5f, -0.5f,  0.5f,-0.5f,  0.5f,  0.5f,-0.5f, -0.5f, -0.5f,-0.5f,  0.5f, -0.5f,// RIGHT0.5f, -0.5f, -0.5f,0.5f,  0.5f, -0.5f,0.5f, -0.5f,  0.5f,0.5f,  0.5f,  0.5f,// TOP-0.5f,  0.5f,  0.5f,0.5f,  0.5f,  0.5f,-0.5f,  0.5f, -0.5f,0.5f,  0.5f, -0.5f,// BOTTOM-0.5f, -0.5f,  0.5f,-0.5f, -0.5f, -0.5f,0.5f, -0.5f,  0.5f,0.5f, -0.5f, -0.5f,};FloatBuffer cubeBuff;float xRot = 0.0f;float yRot = 0.0f;public CubeRenderer(){cubeBuff = makeFloatBuffer(box);//转换为float数组}@Override public void onSurfaceChanged(GL10 gl, int width, int height) {super.onSurfaceChanged(gl, width, height);// 设置透视范围GLU.gluPerspective(gl,45.0f,((float)width)/height,0.1f,10f);}@Override public void onDrawFrame(GL10 gl) {super.onDrawFrame(gl);gl.glMatrixMode(GL10.GL_MODELVIEW);// 切换至模型观察矩阵gl.glLoadIdentity();// 重置当前的模型观察矩阵GLU.gluLookAt(gl,0f,0f,3f,0f,0f,0f,0f,1f,0f);//设置视点和模型中心位置gl.glVertexPointer(3,GL10.GL_FLOAT, 0,cubeBuff);//设置顶点数据gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glRotatef(xRot,1f,0f,0f);// 绕着(0,0,0)与(1,0,0)即x轴旋转gl.glRotatef(yRot,0f,1f,0f);gl.glColor4f(1.0f,0f,0f,1.0f);//设置颜色,红色gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);//绘制正方形FRONT面gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,4,4);gl.glColor4f(0f,1.0f,0f,1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,8,4);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,12,4);gl.glColor4f(0f,0f,1.0f,1.0f);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,16,4);gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,20,4);xRot += 1.0f;yRot += 0.5f;}/*** 将float数组转换为存储在字节缓冲数组* @param arr* @return*/public FloatBuffer makeFloatBuffer(float[] arr){// 分配缓冲空间,一个float占4个字节ByteBuffer byteBuffer = ByteBuffer.allocateDirect(arr.length*4);// 设置字节顺序,其中ByteOrder.nativeOrder()是获取本机字节顺序byteBuffer.order(ByteOrder.nativeOrder());// 转换为float型FloatBuffer floatBuffer = byteBuffer.asFloatBuffer();// 添加数据floatBuffer.put(arr);// 设置数组的起始位置floatBuffer.position(0);return floatBuffer;}
}

效果图:

立方体.png

Android OpenGL 使用相关推荐

  1. Android OpenGL ES(十一)绘制一个20面体 .

    前面介绍了OpenGL ES所有能够绘制的基本图形,点,线段和三角形.其它所有复杂的2D或3D图形都是由这些基本图形构成. 本例介绍如何使用三角形构造一个正20面体.一个正20面体,有12个顶点,20 ...

  2. Android OpenGL使用GLSurfaceView预览视频

    Android OpenGL使用GLSurfaceView预览视频 第一章 相关知识介绍 在介绍具体的功能之前,先对一些主要的类和方法进行一些介绍,这样可以更好的理解整个程序 1.1 GLSurfac ...

  3. 【Android OpenGL ES】阅读hello-gl2代码(二)Java代码

    AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xm ...

  4. EGL接口介绍-----Android OpenGL ES底层开发

    引自:http://www.cnitblog.com/zouzheng/archive/2011/05/30/74326.html EGL 是 OpenGL ES 和底层 Native 平台视窗系统之 ...

  5. Android Opengl

    2019独角兽企业重金招聘Python工程师标准>>> 基础框架 package com.example.opengl;import android.app.Activity; im ...

  6. Android OpenGL射线拾取手势旋转(二)

    上回分解-_-!,Android OpenGL射线拾取&手势旋转(一). 3)Renderer:RayPickRenderer.java OpenGL渲染器,比较多的东西都在这里面了. pub ...

  7. android自定义美颜相机完整程序,Android OpenGL ES从入门到进阶(一)—— 五分钟开发一款美颜相机...

    源码链接:https://github.com/smzhldr/AGLFramework 一.前言 商店里有数十款的美颜相机类产品,其实现原理基本上都是以OpenGL ES为核心的特效处理,大神可以忽 ...

  8. 【OpenGL ES】 Android OpenGL ES -- 透视投影 和 正交投影

    博客地址 : http://blog.csdn.net/shulianghan/article/details/46680803 源码下载 : http://download.csdn.net/det ...

  9. Android OpenGL ES 开发教程(20):颜色Color

    OpenGL ES 支持的颜色格式为RGBA模式(红,绿,蓝,透明度).颜色的定义通常使用Hex格式0xFF00FF 或十进制格式(255,0,255), 在OpenGL 中却是使用0-1之间的浮点数 ...

  10. Android OpenGL ES 2.0绘制简单三角形

    实现步骤 l  实现一个工具类ShalderUtil,用于将着色器代码加载进显卡进行编译 l  实现一个三角形Triangle类 在该类中加载着色器.初始化顶点数据.初始化着色器以及绘制三角形方法 l ...

最新文章

  1. IDEAWebstorm使用
  2. 解决Ubuntu安装依赖问题
  3. 【深度学习】模型训练教程之Focal Loss调参和Dice实现
  4. SolrJ添加删除文档
  5. go 调用其他文件函数_【C# 调用 Go 语言】0x1 Hello Golang
  6. MSFT Outlook VBA处理新邮件的方法
  7. 深度学习(六十八)darknet使用
  8. Android音乐播放器-使用FFmpeg及OpenSLES
  9. 双十一淘宝、京东服务器瘫痪大揭秘 感悟
  10. C Tricks(十七)—— 对角线元素的屏蔽、二维数组(矩阵)的遍历
  11. MAC中已有的虚拟环境在pycharm 中进行调用
  12. jdk下载和安装教程
  13. x9此计算机上没有hasp_中琅条码打印软件安装后弹出HASP错误代码处理方法
  14. 手持式频谱分析仪怎么选择
  15. Linux文件其他操作
  16. iWatch开发的真机调试适配攻略
  17. 技术之道、思维的力量和人生观
  18. Automatically assigning platform `iOS` with version `8.0` on target `Runner`
  19. 程序员养生之道:Google 是如何鼓励员工多吃蔬菜的?
  20. 【Data URL】【RE】【bugku】逆向入门writeup

热门文章

  1. 常用工具——Rsync
  2. SVN使用方法及问题解决
  3. 转载:::::简单分享一个轻量级自动化测试框架目录结构设计
  4. Win8系统如何在桌面行显示我的电脑
  5. 教你手工mysql拆库
  6. 选择FreeBSD的理由?欢迎新人观看^_^
  7. 【css】谈谈 css 的各种居中——读编写高质量代码有感
  8. 如何学习一个新的PHP框架
  9. iPhone的OpenGL ES的资源- 18,你必须知道 !
  10. Android手机常见隐藏代码