Android的OpenGL学习笔记(2)

上篇主要目的是介绍OpenGL的基本框架,这里就用基本的框架绘画出一个三角形,绘制三角形在OpenGL中比较重要,因为在OpenGL(Android)中的图形都是用三角形拼凑起来的!

画三角形有两种,主要是调用的方法不同而已:

第一种,调用glDrawElements()方法绘画:

看代码,主要看继承GLSurfaceView的代码部分,其他的和上篇基本一样:

VortexRenderer.java

Code:
  1. packagecom.droidnova.android.games.vortex;
  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;
  9. publicclassVortexRendererimplementsGLSurfaceView.Renderer{
  10. //privatestaticfinalStringLOG_TAG=VortexRenderer.class.getSimpleName();
  11. privatefloat_red=0f;
  12. privatefloat_green=0f;
  13. privatefloat_blue=0f;
  14. //arawbuffertoholdindicesallowingareuseofpoints.
  15. privateShortBuffer_indexBuffer;
  16. //arawbuffertoholdthevertices
  17. privateFloatBuffer_vertexBuffer;
  18. privateshort[]_indicesArray={0,1,2};//关于索引的理解:即三角形三个顶点的索引,这里暂时画了一个平面二维的三角形,
  19. //看不出它的作用,当画三维的时候,就会清楚了,这里大概提一下,索引组合可以构成一个面!相当于三个点可以构成一个面,这里用索引代替了三个点而已!
  20. privateint_nrOfVertices=3;
  21. privatefloat_angle;
  22. @Override
  23. publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){
  24. //preparation
  25. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  26. initTriangle();
  27. }
  28. @Override
  29. publicvoidonSurfaceChanged(GL10gl,intw,inth){
  30. gl.glViewport(0,0,w,h);
  31. }
  32. @Override
  33. publicvoidonDrawFrame(GL10gl){
  34. //definethecolorwewanttobedisplayedasthe"clippingwall"
  35. gl.glClearColor(_red,_green,_blue,1.0f);
  36. gl.glLoadIdentity();//还原场景,还原矩阵。假如你旋转一个三角形之后,调用这个方法,
  37. //可以让该三角形还原到初始位置,这里的主要作用是为了防止三角形不停的旋转。
  38. //clearthecolorbuffertoshowtheClearColorwecalledabove...
  39. gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  40. //setrotation
  41. gl.glRotatef(_angle,0f,1f,0f);//旋转时需要进行3D图像到2D的转换,需要进行浮点运算,
  42. //会有偏差,所以随着时间的延长,三角形的顶点有偏移现象,暂时就这么理解着!
  43. gl.glColor4f(0.5f,0f,0f,0.5f);//对三角形进行着色!
  44. gl.glVertexPointer(3,GL10.GL_FLOAT,0,_vertexBuffer);//第三个参数表示在数组元素中,两个有意义的数据单元之间相隔的字节数。
  45. //当值为0时,表示该数组数据是紧密排列的,没有间隔
  46. gl.glDrawElements(GL10.GL_TRIANGLES,_nrOfVertices,GL10.GL_UNSIGNED_SHORT,_indexBuffer);
  47. }
  48. privatevoidinitTriangle(){
  49. //floathas4bytes
  50. ByteBuffervbb=ByteBuffer.allocateDirect(_nrOfVertices*3*4);
  51. vbb.order(ByteOrder.nativeOrder());
  52. _vertexBuffer=vbb.asFloatBuffer();//将字节Buffer转换为FloatBuffer,暂时这么理解的!
  53. //shorthas2bytes
  54. ByteBufferibb=ByteBuffer.allocateDirect(_nrOfVertices*2);//申请空间
  55. ibb.order(ByteOrder.nativeOrder());//必须设置为原生字节序!
  56. _indexBuffer=ibb.asShortBuffer();
  57. float[]coords={
  58. -0.5f,-0.5f,0f,//(x1,y1,z1)
  59. 0.5f,-0.5f,0f,//(x2,y2,z2)
  60. 0f,0.5f,0f//(x3,y3,z3)
  61. };
  62. _vertexBuffer.put(coords);
  63. _indexBuffer.put(_indicesArray);
  64. _vertexBuffer.position(0);
  65. _indexBuffer.position(0);
  66. }
  67. publicvoidsetColor(floatr,floatg,floatb){
  68. _red=r;
  69. _green=g;
  70. _blue=b;
  71. }
  72. publicvoidsetAngle(floatangle){
  73. _angle=angle;
  74. }
  75. }

VortexView.java

Code:
  1. packagecom.droidnova.android.games.vortex;
  2. importandroid.content.Context;
  3. importandroid.opengl.GLSurfaceView;
  4. importandroid.view.MotionEvent;
  5. publicclassVortexViewextendsGLSurfaceView{
  6. //privatestaticfinalStringLOG_TAG=VortexView.class.getSimpleName();
  7. privateVortexRenderer_renderer;
  8. publicVortexView(Contextcontext){
  9. super(context);
  10. _renderer=newVortexRenderer();
  11. setRenderer(_renderer);
  12. }
  13. publicbooleanonTouchEvent(finalMotionEventevent){
  14. queueEvent(newRunnable(){
  15. publicvoidrun(){
  16. _renderer.setColor(event.getX()/getWidth(),event.getY()
  17. /getHeight(),1.0f);
  18. _renderer.setAngle(event.getX());
  19. }
  20. });
  21. returntrue;
  22. }
  23. }

第二种,调用glDrawArrays()绘画三角形:

GLRender.java代码:

Code:
  1. packagecom.android.myOpenGL;
  2. importjava.nio.ByteBuffer;
  3. importjava.nio.ByteOrder;
  4. importjava.nio.FloatBuffer;
  5. importjavax.microedition.khronos.egl.EGLConfig;
  6. importjavax.microedition.khronos.opengles.GL10;
  7. importandroid.opengl.GLSurfaceView.Renderer;
  8. publicclassGLRenderimplementsRenderer{
  9. privatefloat_red=0.9f;
  10. privatefloat_green=0.2f;
  11. privatefloat_blue=0.2f;
  12. privatefloat_angle;
  13. privateFloatBuffer_vertexBuffer;
  14. privateint_nrOfVertices=3;
  15. @Override
  16. publicvoidonDrawFrame(GL10gl){
  17. //TODOAuto-generatedmethodstub
  18. gl.glClearColor(_red,_green,_blue,1.0f);
  19. gl.glLoadIdentity();//如果注释掉这句,效果将如同地球绕太阳旋转一样,自身旋转,也绕太阳公转,注意三角形分正反面
  20. gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
  21. gl.glTranslatef(0.5f,0f,0f);
  22. gl.glRotatef(_angle,0f,1f,0f);//绕Y轴旋转,Y轴正方向单位1处,X,Y,Z三个参数共同决定讯转轴的方向。
  23. _angle++;//为了测试旋转平移的先后顺序会对结果造成何种影响添加上的,这样也可以让三角形不停的旋转,一般我喜欢这么做!
  24. /*
  25. *先旋转还是先平移,顺序不同,效果也会不同的,具体怎么样的效果,自己运行一下程序,并改变次序,就会得到结果!
  26. */
  27. gl.glColor4f(0.5f,0f,0f,0.5f);
  28. gl.glVertexPointer(3,GL10.GL_FLOAT,0,_vertexBuffer);
  29. gl.glDrawArrays(GL10.GL_TRIANGLES,0,3);
  30. //gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);//取消顶点设置,如果在这里添加这句,三角形会一闪而过。为了显示三角形,我们注释掉这句话。
  31. }
  32. @Override
  33. publicvoidonSurfaceChanged(GL10gl,intwidth,intheight){
  34. //TODOAuto-generatedmethodstub
  35. gl.glViewport(0,0,width,height);
  36. }
  37. @Override
  38. publicvoidonSurfaceCreated(GL10gl,EGLConfigarg1){
  39. //TODOAuto-generatedmethodstub
  40. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  41. initTriangle();
  42. }
  43. privatevoidinitTriangle(){
  44. //floathas4bytes
  45. ByteBuffervbb=ByteBuffer.allocateDirect(_nrOfVertices*3*4);
  46. vbb.order(ByteOrder.nativeOrder());
  47. _vertexBuffer=vbb.asFloatBuffer();
  48. float[]coords={
  49. -0.5f,-0.5f,0f,//(x1,y1,z1)
  50. 0.5f,-0.5f,0f,//(x2,y2,z2)
  51. 0f,0.5f,0f//(x3,y3,z3)
  52. };
  53. _vertexBuffer.put(coords);
  54. _vertexBuffer.position(0);
  55. }
  56. publicvoidsetColor(floatr,floatg,floatb){
  57. _red=r;
  58. _green=g;
  59. _blue=b;
  60. }
  61. publicvoidsetAngle(floatangle){
  62. _angle=angle;
  63. }
  64. }

最终效果图都是一样的,如图:

必要的解释都在代码注释中,如有问题,请留言提出,如有错误,也同样请留言指出,小弟感激不尽……

更多相关文章

  1. 【eoeAndroid社区索引】Android二维码知识汇总
  2. [置顶] 【Android Notes】置顶索引
  3. Joggler索引页
  4. Android drawable 三角形
  5. 关于android实现fastindexbar(快速索引)详解
  6. Android 之 Fast Scroll 、字母索引栏
  7. Android下使用OpenGL绘制三角形
  8. Android ListView城市列表,按a-z分组字母索引排序
  9. LXR 索引Android 源码

随机推荐

  1. android滑动标题栏渐变实现
  2. Android(安卓)Spinner 下拉列表
  3. 使用Kotlin的Android(安卓)TextView –全
  4. android 颜色大全 color文件
  5. Android示例 JobService分析
  6. something about simple_list_item_1
  7. android studio调试堆栈日志输出
  8. Android(安卓)WebService(基于SOAP协议)
  9. Android开发第3-3课:支持不同的平台版本
  10. 简单定时器 Timer