Android的OpenGL学习笔记(3)

 为了验证我们以前在旋转三角形的时候,到底是在旋转三角形本身,还是在旋转场景,现在用下面的实例代码验证,就会一目了然了:

MainActivity和前面的MainActivity一样,主要区别在继承GLSurfaceView.Renderer这段代码:

VortexRenderer.java代码:

Code:
  1. package com.droidnova.android.games.vortex;  
  2.   
  3. import java.nio.ByteBuffer;  
  4. import java.nio.ByteOrder;  
  5. import java.nio.FloatBuffer;  
  6. import java.nio.ShortBuffer;  
  7.   
  8. import javax.microedition.khronos.egl.EGLConfig;  
  9. import javax.microedition.khronos.opengles.GL10;  
  10.   
  11. import android.opengl.GLSurfaceView;  
  12.   
  13. public class VortexRenderer implements GLSurfaceView.Renderer {  
  14.     //private static final String LOG_TAG = VortexRenderer.class.getSimpleName();  
  15.       
  16.     private float _red = 0f;  
  17.     private float _green = 0f;  
  18.     private float _blue = 0f;  
  19.   
  20.     // a raw buffer to hold indices allowing a reuse of points.  
  21.     private ShortBuffer _indexBuffer;  
  22.     private ShortBuffer _indexBufferStatic;  
  23.       
  24.     // a raw buffer to hold the vertices  
  25.     private FloatBuffer _vertexBuffer;  
  26.     private FloatBuffer _vertexBufferStatic;  
  27.       
  28.     private short[] _indicesArray = {012};  
  29.     private int _nrOfVertices = 3;  
  30.   
  31.     private float _angle;  
  32.       
  33.     @Override  
  34.     public void onSurfaceCreated(GL10 gl, EGLConfig config) {  
  35.         // preparation  
  36.         gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  
  37.         initTriangle();  
  38.         initStaticTriangle();  
  39.     }  
  40.   
  41.     @Override  
  42.     public void onSurfaceChanged(GL10 gl, int w, int h) {  
  43.         gl.glViewport(00, w, h);  
  44.     }  
  45.       
  46.     public void setAngle(float angle) {  
  47.         _angle = angle;  
  48.     }  
  49.   
  50.     @Override  
  51.     public void onDrawFrame(GL10 gl) {  
  52.         // define the color we want to be displayed as the "clipping wall"  
  53.         gl.glClearColor(_red, _green, _blue, 1.0f);  
  54.           
  55.         // reset the matrix - good to fix the rotation to a static angle  
  56.         gl.glLoadIdentity();  
  57.           
  58.         // clear the color buffer to show the ClearColor we called above...  
  59.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT);  
  60.       
  61.         // draw the static triangle  
  62.         gl.glColor4f(0.5f, 0f, 0f, 0.5f);  
  63.         gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);  
  64.         //第三个参数表示在数组元素中,两个有意义的数据单元之间相隔的字节数。  
  65.         //当值为0时,表示该数组数据是紧密排列的,没有间隔  
  66.         gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);  
  67.         //gl.glDrawArrays(mode, first, count);  
  68.         // set rotation for the non-static triangle  
  69.         gl.glRotatef(_angle, 0f, 1f, 0f);  
  70.   
  71.         gl.glColor4f(0f, 0.5f, 0f, 0.5f);  
  72.         gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBufferStatic);  
  73.         gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBufferStatic);  
  74.           
  75.     }  
  76.       
  77.     private void initTriangle() {  
  78.         // float has 4 bytes  
  79.         ByteBuffer vbb = ByteBuffer.allocateDirect(_nrOfVertices * 3 * 4);//对于每个顶点的位置,由x,y,z3个float分量组成,每个float占4个字节  
  80.         //因此申请的总长度为_nrOfVertices * 3 * 4,必须要使用allocateDirect.  
  81.         vbb.order(ByteOrder.nativeOrder());//必须要设置为原生字节序  
  82.         _vertexBuffer = vbb.asFloatBuffer();  
  83.           
  84.         // short has 2 bytes  
  85.         ByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfVertices * 2);//同上  
  86.         ibb.order(ByteOrder.nativeOrder());  
  87.         _indexBuffer = ibb.asShortBuffer();  
  88.           
  89.         float[] coords = {  
  90.             -0.5f, -0.5f, 0f, // (x1, y1, z1)  
  91.             0.5f, -0.5f, 0f, // (x2, y2, z2)  
  92.             0f, 0.5f, 0f // (x3, y3, z3)  
  93.         };  
  94.           
  95.         _vertexBuffer.put(coords);  
  96.           
  97.         _indexBuffer.put(_indicesArray);  
  98.           
  99.         _vertexBuffer.position(0);  
  100.         _indexBuffer.position(0);  
  101.     }  
  102.       
  103.     private void initStaticTriangle() {  
  104.         // float has 4 bytes  
  105.         ByteBuffer vbb = ByteBuffer.allocateDirect(_nrOfVertices * 3 * 4);  
  106.         vbb.order(ByteOrder.nativeOrder());  
  107.         _vertexBufferStatic = vbb.asFloatBuffer();  
  108.           
  109.         // short has 4 bytes  
  110.         ByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfVertices * 2);  
  111.         ibb.order(ByteOrder.nativeOrder());  
  112.         _indexBufferStatic = ibb.asShortBuffer();  
  113.           
  114.         float[] coords = {  
  115.             -0.4f, -0.4f, 0f, // (x1, y1, z1)  
  116.             0.4f, -0.4f, 0f, // (x2, y2, z2)  
  117.             0f, 0.4f, 0f // (x3, y3, z3)  
  118.         };  
  119.           
  120.         _vertexBufferStatic.put(coords);  
  121.           
  122.         _indexBufferStatic.put(_indicesArray);  
  123.           
  124.         _vertexBufferStatic.position(0);  
  125.         _indexBufferStatic.position(0);  
  126.     }  
  127.       
  128.     public void setColor(float r, float g, float b) {  
  129.         _red = r;  
  130.         _green = g;  
  131.         _blue = b;  
  132.     }  
  133. }  

VortexView.java代码:

Code:
  1. package com.droidnova.android.games.vortex;  
  2.   
  3. import android.content.Context;  
  4. import android.opengl.GLSurfaceView;  
  5. import android.view.MotionEvent;  
  6.   
  7. public class VortexView extends GLSurfaceView {  
  8.     // private static final String LOG_TAG = VortexView.class.getSimpleName();  
  9.     private VortexRenderer _renderer;  
  10.   
  11.     public VortexView(Context context) {  
  12.         super(context);  
  13.         _renderer = new VortexRenderer();  
  14.         setRenderer(_renderer);  
  15.     }  
  16.   
  17.     public boolean onTouchEvent(final MotionEvent event) {  
  18.         queueEvent(new Runnable() {  
  19.             public void run() {  
  20.                 _renderer.setColor(event.getX() / getWidth(), event.getY()  
  21.                         / getHeight(), 1.0f);  
  22.                 _renderer.setAngle(event.getX());  
  23.             }  
  24.         });  
  25.         return true;  
  26.     }  
  27. }  

运行结果:

 

你可能感兴趣的:(Android的OpenGL学习笔记(3))