`
jandroid
  • 浏览: 1954905 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Android OpenGL学习笔记(二)--三角形的绘制.

阅读更多

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

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

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

 

  1. package  com.android.tutor;   
  2. import  android.app.Activity;   
  3. import  android.os.Bundle;   
  4. public   class  OpenGL_Lesson2  extends  Activity {   
  5.       
  6.      private  OpenGlView mOpenGlView;   
  7.      public   void  onCreate(Bundle savedInstanceState) {   
  8.          super .onCreate(savedInstanceState);   
  9.          
  10.         mOpenGlView =  new  OpenGlView( this );   
  11.         setContentView(mOpenGlView);   
  12.                  
  13.     }   
  14. }  
  1. package  com.android.tutor;  
  2. import  android.app.Activity;  
  3. import  android.os.Bundle;  
  4. public   class  OpenGL_Lesson2  extends  Activity {  
  5.      
  6.     private  OpenGlView mOpenGlView;  
  7.     public   void  onCreate(Bundle savedInstanceState) {  
  8.         super .onCreate(savedInstanceState);  
  9.         
  10.         mOpenGlView = new  OpenGlView( this );  
  11.         setContentView(mOpenGlView);  
  12.                 
  13.     }  
  14. }  

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

 

  1. package  com.android.tutor;   
  2. import  android.content.Context;   
  3. import  android.opengl.GLSurfaceView;   
  4. public   class  OpenGlView  extends  GLSurfaceView {   
  5.        
  6.      private  OpenGlRender mOpenGlRender;   
  7.      public  OpenGlView(Context context) {   
  8.          super (context);   
  9.         mOpenGlRender =  new  OpenGlRender();   
  10.         setRenderer(mOpenGlRender);   
  11.     }   
  12.        
  13.        
  14.        
  15. }  
  1. package  com.android.tutor;  
  2. import  android.content.Context;  
  3. import  android.opengl.GLSurfaceView;  
  4. public   class  OpenGlView  extends  GLSurfaceView {  
  5.       
  6.     private  OpenGlRender mOpenGlRender;  
  7.     public  OpenGlView(Context context) {  
  8.         super (context);  
  9.         mOpenGlRender = new  OpenGlRender();  
  10.         setRenderer(mOpenGlRender);  
  11.     }  
  12.       
  13.       
  14.       
  15. }  

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

 

  1. package  com.android.tutor;   
  2. import  java.nio.ByteBuffer;   
  3. import  java.nio.ByteOrder;   
  4. import  java.nio.FloatBuffer;   
  5. import  java.nio.ShortBuffer;   
  6. import  javax.microedition.khronos.egl.EGLConfig;   
  7. import  javax.microedition.khronos.opengles.GL10;   
  8. import  android.opengl.GLSurfaceView.Renderer;   
  9. public   class  OpenGlRender  implements  Renderer {   
  10.        
  11.      private   float  _red = 0f;   
  12.      private   float  _green = 25f;   
  13.      private   float  _blue = 200f;   
  14.        
  15.      private  ShortBuffer _indexBuffer;   
  16.        
  17.      private  FloatBuffer _vertexBuffer;   
  18.        
  19.        
  20.      private   short [] _indicesArray = { 0 1 2 };   
  21.      private   int  _nrOfVertices =  3 ;   
  22.      @Override   
  23.      public   void  onSurfaceCreated(GL10 gl, EGLConfig config) {   
  24.            
  25.         gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);   
  26.         initTriangle();   
  27.     }   
  28.      @Override   
  29.      public   void  onSurfaceChanged(GL10 gl,  int  width,  int  height) {   
  30.            
  31.         gl.glViewport( 0 0 , width, height);   
  32.     }   
  33.   
  34.        
  35.      @Override   
  36.      public   void  onDrawFrame(GL10 gl) {   
  37.         gl.glClearColor(_red, _green, _blue,  1 .0f);   
  38.            
  39.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT);   
  40.            
  41.          gl.glColor4f( 0 .5f, 0f, 0f,  0 .5f);   
  42.          gl.glVertexPointer(_nrOfVertices, GL10.GL_FLOAT,  0 , _vertexBuffer);   
  43.          gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);   
  44.     }   
  45.        
  46.      private   void  initTriangle() {   
  47.          // float has 4 bytes   
  48.         ByteBuffer vbb = ByteBuffer.allocateDirect(_nrOfVertices *  3  *  4 );   
  49.         vbb.order(ByteOrder.nativeOrder());   
  50.         _vertexBuffer = vbb.asFloatBuffer();   
  51.            
  52.          // short has 4 bytes   
  53.         ByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfVertices *  2 );   
  54.         ibb.order(ByteOrder.nativeOrder());   
  55.         _indexBuffer = ibb.asShortBuffer();   
  56.            
  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.            
  63.         _vertexBuffer.put(coords);   
  64.            
  65.         _indexBuffer.put(_indicesArray);   
  66.            
  67.         _vertexBuffer.position( 0 );   
  68.         _indexBuffer.position( 0 );   
  69.     }   
  70. }  
  1. package  com.android.tutor;  
  2. import  java.nio.ByteBuffer;  
  3. import  java.nio.ByteOrder;  
  4. import  java.nio.FloatBuffer;  
  5. import  java.nio.ShortBuffer;  
  6. import  javax.microedition.khronos.egl.EGLConfig;  
  7. import  javax.microedition.khronos.opengles.GL10;  
  8. import  android.opengl.GLSurfaceView.Renderer;  
  9. public   class  OpenGlRender  implements  Renderer {  
  10.       
  11.     private   float  _red = 0f;  
  12.     private   float  _green = 25f;  
  13.     private   float  _blue = 200f;  
  14.       
  15.     private  ShortBuffer _indexBuffer;  
  16.       
  17.     private  FloatBuffer _vertexBuffer;  
  18.       
  19.       
  20.     private   short [] _indicesArray = { 0 1 2 };  
  21.     private   int  _nrOfVertices =  3 ;  
  22.     @Override   
  23.     public   void  onSurfaceCreated(GL10 gl, EGLConfig config) {  
  24.           
  25.         gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  
  26.         initTriangle();  
  27.     }  
  28.     @Override   
  29.     public   void  onSurfaceChanged(GL10 gl,  int  width,  int  height) {  
  30.           
  31.         gl.glViewport(0 0 , width, height);  
  32.     }  
  33.   
  34.       
  35.     @Override   
  36.     public   void  onDrawFrame(GL10 gl) {  
  37.         gl.glClearColor(_red, _green, _blue, 1 .0f);  
  38.           
  39.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT);  
  40.           
  41.          gl.glColor4f(0 .5f, 0f, 0f,  0 .5f);  
  42.          gl.glVertexPointer(_nrOfVertices, GL10.GL_FLOAT, 0 , _vertexBuffer);  
  43.          gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);  
  44.     }  
  45.       
  46.     private   void  initTriangle() {  
  47.         // float has 4 bytes   
  48.         ByteBuffer vbb = ByteBuffer.allocateDirect(_nrOfVertices * 3  *  4 );  
  49.         vbb.order(ByteOrder.nativeOrder());  
  50.         _vertexBuffer = vbb.asFloatBuffer();  
  51.           
  52.         // short has 4 bytes   
  53.         ByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfVertices * 2 );  
  54.         ibb.order(ByteOrder.nativeOrder());  
  55.         _indexBuffer = ibb.asShortBuffer();  
  56.           
  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.           
  63.         _vertexBuffer.put(coords);  
  64.           
  65.         _indexBuffer.put(_indicesArray);  
  66.           
  67.         _vertexBuffer.position(0 );  
  68.         _indexBuffer.position(0 );  
  69.     }  
  70. }  

五、运行之,效果如下:

 

今天晚上就先不做详细解释了!改日在加上!谢谢~

分享到:
评论

相关推荐

    code__opengl学习笔记2-绘制矩形

    在"code__opengl学习笔记1-基本的运行框架"中,可能包含了如何设置OpenGL环境、编译和运行程序的基础知识。这通常包括安装必要的库、配置编译器、创建项目结构以及理解GLUT的基本用法。这些都是进行OpenGL编程的先决...

    code__opengl学习笔记1-基本的运行框架

    OpenGL学习笔记1 - 基本的运行框架 在计算机图形学领域,OpenGL是一个广泛使用的跨语言、跨平台的应用程序编程接口(API),用于渲染2D、3D图像。本笔记将聚焦于如何在Visual Studio 2012环境下搭建一个基本的...

    NeHe OpenGL教程 学习笔记1

    总的来说,NeHe OpenGL教程的学习笔记1主要涵盖了OpenGL环境的初始化、基本几何形状的绘制、颜色设定、视口与投影以及渲染流程的基础概念。通过理解和实践这些基本操作,开发者可以逐步构建更复杂的3D场景。

    Qt_OpenGL3D图形的绘制和旋转

    如果我们要绘制一个3D的四棱锥只需要绘制这5个面即可,绘制的方法和前一篇文章OpenGL_Qt学习笔记之_03(平面图形的着色和旋转)的相同。只不过这里的顶点坐标是3维的,所以图像深度那一维不一定为0。因此我们可以事先...

    Opengl学习笔记

    ### OpenGL学习笔记关键知识点 #### 一、OpenGL坐标系与绘图函数 - **坐标系定义**:在OpenGL中,坐标系定义了三维空间中物体的位置。X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从观察者的视角由近及远(即从里至...

    现代OpenGL+Qt学习笔记之三:显示一个彩色三角形

    现代OpenGL+Qt学习笔记之三:显示一个彩色三角形http://blog.csdn.net/chaojiwudixiaofeixia/article/details/77927876源码。

    opengl.rar_GDE_learn opengl_run

    "Learn of OpenGL"表明这是一个关于学习OpenGL的资源集合,可能是教程、代码示例或者学习笔记。"run under GDE"则表示这些学习资料是在图形开发环境(GDE)中运行的,GDE可能是Generic Debug Environment或其他类似...

    Python-Opengl的练习作业.zip

    这个“Python学习笔记”可能包含了这些主题的代码示例和解释,帮助初学者逐步掌握OpenGL的使用。ljg_resource可能是一个包含资源文件的目录,如纹理图像、模型数据或辅助脚本,这些都是实际项目中常见的组成部分。 ...

    WebGL学习笔记(一).rar

    在“WebGL学习笔记(一)”中,我们将会探讨WebGL的基本概念、工作原理以及如何开始编写你的第一个WebGL程序。 1. **WebGL基本概念** - **上下文(Context)**:在HTML5中,WebGL是Canvas元素的一个上下文,通过`...

    webgl学习笔记初学记录00

    它是WebGL学习笔记的重点,特别是在初学者阶段。WebGL的核心是光栅化引擎,它能够根据程序员编写的代码在GPU上绘制点、线和三角形,进而构建复杂的3D场景。 在WebGL中,所有图形渲染都是通过GPU来执行的,这需要...

    WebGL-Study-Notes:WebGL学习笔记

    在这个名为"WebGL-Study-Notes"的资源包中,我们可以预见到一系列关于WebGL的学习笔记和示例代码。 WebGL的核心是通过JavaScript与GPU(图形处理器)进行通信,从而实现硬件加速的图形渲染。它允许开发者在网页上...

    jisuanjituxingxue1.rar_glut.def_jisuanjituxingxue1

    压缩包中的“第三章、OpenGL”很可能包含了关于OpenGL编程的课件内容,可能包括PPT、笔记、示例代码等。在这一章节中,你可能会学到以下几个关键概念: 1. **顶点(Vertices)**:在OpenGL中,图形是由一系列顶点...

    CocosCreatorWebGL:用cocos creator实现《WebGL编程指南》里面的案例

    这可能包括基本的几何形状绘制、颜色和光照处理、纹理映射、以及更高级的技术如模型加载、动画播放等。通过这些案例,开发者可以深入理解WebGL的基本原理和Cocos Creator的使用技巧。 在文件"CocosCreatorWebGL-...

Global site tag (gtag.js) - Google Analytics