OpenGL ES

简介

  OpenGL- ES 是免授权费的, 跨平台的,功能完善的2D3D图形应用程序接口API,主要针对多种嵌入式系统专门设计 - 包括控制台、移动电话、手持设备、家电设备和汽车。它由精心定义的桌面OpenGL子集组成,创造了软件与图形加速间灵活强大的底层交互接口。 OpenGL ES 包含浮点运算定点运算系统描述以及EGL针对便携设备的本地视窗系统规范。OpenGL ES 1.X 面向功能固定的硬件所设计并提供加速支持、图形质量及性能标准。OpenGL ES 2.X 则提供包括遮盖器技术在内的全可编程3D图形算法。

OpenGL ES 支持绘制的基本几何图形分为三类:点,线段,三角形。也就是说OpenGL ES 只能绘制这三种基本几何图形。任何复杂的2D或是3D图形都是通过这三种几何图形构造而成的。


在Android中一般用SurfaceView来绘制2D图形,3D的OpenGL 视图则用GLSurfaceView来显示,通过实现Renderer接口来渲染3D图形。

所以我们首先来建立一个实现了Renderer接口的类,代码有详细注释:

[java] view plain copy print ?
  1. publicclassGLRenderimplementsRenderer{
  2. privatefloatrotateTri;
  3. privateintone=0x10000;
  4. //三角形的一个顶点
  5. privateIntBuffertriggerBuffer=BufferUtil.fBuffer(newint[]{
  6. 0,one,0,//上顶点
  7. -one,-one,0,//左顶点
  8. one,-one,0//右下点
  9. });
  10. privateIntBuffercolorBuffer=BufferUtil.fBuffer(newint[]{
  11. one,0,0,one,
  12. 0,one,0,one,
  13. 0,0,one,one
  14. });
  15. publicvoidonDrawFrame(GL10gl){
  16. //清除屏幕和深度缓存
  17. gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
  18. //重置当前的模型观察矩阵
  19. gl.glLoadIdentity();
  20. //左移1.5单位,并移入屏幕6.0
  21. gl.glTranslatef(-1.5f,0.0f,-6.0f);
  22. //设置旋转
  23. gl.glRotatef(rotateTri,0.0f,1.0f,0.0f);
  24. //设置定点数组
  25. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  26. //设置颜色数组
  27. gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
  28. gl.glColorPointer(4,GL10.GL_FIXED,0,colorBuffer);
  29. //设置三角形顶点
  30. gl.glVertexPointer(3,GL10.GL_FIXED,0,triggerBuffer);
  31. //绘制三角形
  32. gl.glDrawArrays(GL10.GL_TRIANGLES,0,3);
  33. //取消顶点数组
  34. gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
  35. //绘制三角形结束
  36. gl.glFinish();
  37. }
  38. publicvoidonSurfaceChanged(GL10gl,intwidth,intheight){
  39. floatratio=(float)width/height;
  40. //设置OpenGL场景的大小
  41. gl.glViewport(0,0,width,height);
  42. //设置投影矩阵
  43. gl.glMatrixMode(GL10.GL_PROJECTION);
  44. //重置投影矩阵
  45. gl.glLoadIdentity();
  46. //设置视口的大小
  47. gl.glFrustumf(-ratio,ratio,-1,1,1,10);
  48. //选择模型观察矩阵
  49. gl.glMatrixMode(GL10.GL_MODELVIEW);
  50. //重置模型观察矩阵
  51. gl.glLoadIdentity();
  52. }
  53. publicvoidonSurfaceCreated(GL10gl,EGLConfigarg1){
  54. //启用阴影平滑
  55. gl.glShadeModel(GL10.GL_SMOOTH);
  56. //黑色背景,银灰色
  57. gl.glClearColor(1,1,1,0);
  58. //设置深度缓存
  59. gl.glClearDepthf(1.0f);
  60. //启用深度测试
  61. gl.glEnable(GL10.GL_DEPTH_TEST);
  62. //所作深度测试的类型
  63. gl.glDepthFunc(GL10.GL_LEQUAL);
  64. //告诉系统对透视进行修正
  65. gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);
  66. }
  67. }

在MainActivity中:

[java] view plain copy print ?
  1. publicclassMainActivityextendsActivity{
  2. Rendererrender=newGLRender();
  3. publicvoidonCreate(BundlesavedInstanceState){
  4. super.onCreate(savedInstanceState);
  5. GLSurfaceViewgview=newGLSurfaceView(this);
  6. gview.setRenderer(render);
  7. setContentView(gview);
  8. }
  9. }

如果顶点数组报错: must user a native order idrect buffer

就将数组转化一下:

[java] view plain copy print ?
  1. publicstaticIntBufferfBuffer(int[]a){
  2. ByteBuffermbb=ByteBuffer.allocateDirect(a.length*4);
  3. //数组排列用nativeOrder
  4. mbb.order(ByteOrder.nativeOrder());
  5. floatBuffer=mbb.asIntBuffer();
  6. floatBuffer.put(a);
  7. floatBuffer.position(0);
  8. returnfloatBuffer;
  9. }

运行效果如下:

更多相关文章

  1. Android 绘图基础:Path(绘制三角形、贝塞尔曲线、正余弦)
  2. android ListView 刷新数据,加载时遇到的数组越界问题
  3. 用Java 在 KSOAP中序列化复杂对象数组实体
  4. Android绘制三角形实现带小三角的PopupWindow
  5. android:minSdkVersion =3改成7导致我的surfaceview的位置出现偏
  6. 学习 Android 平台 OpenGL ES API,了解 OpenGL 开发的基本流程,使
  7. 警惕rapidxml的陷阱(二):在Android上默认内存池分配数组过大,容易导
  8. Android列表实现(1)_数组列表实例介绍
  9. Android NDK:JNI 数组的输入输出

随机推荐

  1. 台湾老专家:由蝴蝶效应谈运维的系统思考
  2. 「台湾精益老专家」实践一日 Sprint 的个
  3. 「台湾精益老专家」一個人如何施行敏捷?
  4. 从作坊到工厂:传统企业 DevOps 改造历程
  5. 赵成:蘑菇街 DevOps 实践和转型之路
  6. 基于ssm的客户管理系统
  7. php导出csv文件
  8. phpstorm好插件
  9. H5和HTML5的区别
  10. PHP 将一位数组进行倒序排列