Android OpenGL ES 基础:绘制三角形

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接口的类,代码有详细注释:

  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中:

  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

就将数组转化一下:

  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. }

运行效果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值