前面讲了一些Android OpenGl 的概念问题,这一节讲给大家讲一下如何画一个三角现出来.

一、新建一个Android工程命名为:OpenGL_Lesson2.

二、修改OpenGL_Lesson2.java代码如下:

  1. packagecom.android.tutor;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. publicclassOpenGL_Lesson2extendsActivity{
  5. privateOpenGlViewmOpenGlView;
  6. publicvoidonCreate(BundlesavedInstanceState){
  7. super.onCreate(savedInstanceState);
  8. mOpenGlView=newOpenGlView(this);
  9. setContentView(mOpenGlView);
  10. }
  11. }

三、新建一个类OpenGlView.java继承与GLSurfaceView,代码如下:

  1. packagecom.android.tutor;
  2. importandroid.content.Context;
  3. importandroid.opengl.GLSurfaceView;
  4. publicclassOpenGlViewextendsGLSurfaceView{
  5. privateOpenGlRendermOpenGlRender;
  6. publicOpenGlView(Contextcontext){
  7. super(context);
  8. mOpenGlRender=newOpenGlRender();
  9. setRenderer(mOpenGlRender);
  10. }
  11. }

四、新建一个OpenGlRender.java类继承与Renderer,代码如下:

  1. packagecom.android.tutor;
  2. importjava.nio.ByteBuffer;
  3. importjava.nio.ByteOrder;
  4. importjava.nio.FloatBuffer;
  5. importjava.nio.ShortBuffer;
  6. importjavax.microedition.khronos.egl.EGLConfig;
  7. importjavax.microedition.khronos.opengles.GL10;
  8. importandroid.opengl.GLSurfaceView.Renderer;
  9. publicclassOpenGlRenderimplementsRenderer{
  10. privatefloat_red=0f;
  11. privatefloat_green=25f;
  12. privatefloat_blue=200f;
  13. privateShortBuffer_indexBuffer;
  14. privateFloatBuffer_vertexBuffer;
  15. privateshort[]_indicesArray={0,1,2};
  16. privateint_nrOfVertices=3;
  17. @Override
  18. publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){
  19. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  20. initTriangle();
  21. }
  22. @Override
  23. publicvoidonSurfaceChanged(GL10gl,intwidth,intheight){
  24. gl.glViewport(0,0,width,height);
  25. }
  26. @Override
  27. publicvoidonDrawFrame(GL10gl){
  28. gl.glClearColor(_red,_green,_blue,1.0f);
  29. gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  30. gl.glColor4f(0.5f,0f,0f,0.5f);
  31. gl.glVertexPointer(_nrOfVertices,GL10.GL_FLOAT,0,_vertexBuffer);
  32. gl.glDrawElements(GL10.GL_TRIANGLES,_nrOfVertices,GL10.GL_UNSIGNED_SHORT,_indexBuffer);
  33. }
  34. privatevoidinitTriangle(){
  35. //floathas4bytes
  36. ByteBuffervbb=ByteBuffer.allocateDirect(_nrOfVertices*3*4);
  37. vbb.order(ByteOrder.nativeOrder());
  38. _vertexBuffer=vbb.asFloatBuffer();
  39. //shorthas4bytes
  40. ByteBufferibb=ByteBuffer.allocateDirect(_nrOfVertices*2);
  41. ibb.order(ByteOrder.nativeOrder());
  42. _indexBuffer=ibb.asShortBuffer();
  43. float[]coords={
  44. -0.5f,-0.5f,0f,//(x1,y1,z1)
  45. 0.5f,-0.5f,0f,//(x2,y2,z2)
  46. 0f,0.5f,0f//(x3,y3,z3)
  47. };
  48. _vertexBuffer.put(coords);
  49. _indexBuffer.put(_indicesArray);
  50. _vertexBuffer.position(0);
  51. _indexBuffer.position(0);
  52. }
  53. }

五、运行之,效果如下:

vertexBuffer 定义每个顶点的位置; indexBuffer 定义三角形中顶点在 vertextBuffer 中的索引。使用 indexBuffer 和 vertextBuffer 可以节省空间(因为可重复利用 vertex )。

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. android binder 机制三(匿名Service)
  3. Android(安卓)打开相册选择单张图片实现代码
  4. Android(安卓)使用junit测试
  5. Android(安卓)studio 多渠道打包
  6. android基本程序单元Activity
  7. Android中TextView滚动显示信息的效果
  8. Android无需申请权限拨打电话的两种方式
  9. android的TabActivity

随机推荐

  1. XML中处理指令的代码详解
  2. 详细介绍XML Web Service图文代码实例
  3. 详细介绍XML代码编写的编码与验证问题
  4. XSLT语法—在.net中使用XSLT转换xml文档
  5. XML中的DTD文档类型定义详细介绍
  6. XmlSerializer 对象的Xml序列化和反序列
  7. XML编程中的模式定义XSD示例代码详解
  8. XML中的树形结构与DOM文档对象模型的示例
  9. XPath语法: 在C#中使用XPath示例的具体代
  10. 详解通过XmlDocument读写Xml文档的示例代