android开发之OpenGL(一)

OpenGL 初步介绍:

1.了解一下android的OpenGL 

  Android系统使用 OpenGL 的标准接口来支持3D图形功能,android 3D 图形系统也分为 java 框架本地代码两部分。本地代码主要实现的 OpenGL 接口的库,在 Java 框架层,javax.microedition.khronos.opengles 是 java标准的 OpenGL 包,android.opengl包提供了 OpenGL 系统和 Android GUI 系统之间的联系。

  Android 支持 OpenGL 列表

  • 1、GL
  • 2、GL 10
  • 3、GL 10 EXT
  • 4、GL 11
  • 5、GL 11 EXT
  • 6、GL 11 ExtensionPack

2.实践是最好的学习方法。

  新建一个项目,如图

    

  Opengl2Activity.java的代码为:

  

1 Renderer renderer = new OpenGLRenderer();
2     @Override
3     public void onCreate(Bundle savedInstanceState) {
4         super.onCreate(savedInstanceState);
5         GLSurfaceView view = new GLSurfaceView(this);
6         view.setRenderer(renderer);
7         setContentView(view);
8     }

  openGLRenderer中有三个必须要实现的三个方法:

  • onSurfaceCreated(GL10 gl, EGLConfig config)          ---->初始化
    •  1 public void onSurfaceCreated(GL10 gl, EGLConfig config) {
       2         gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
       3 
       4         gl.glShadeModel(GL10.GL_SMOOTH);
       5 
       6         gl.glClearDepthf(1.0f);
       7 
       8         gl.glEnable(GL10.GL_DEPTH_TEST);
       9 
      10         gl.glDepthFunc(GL10.GL_LEQUAL);
      11 
      12         gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
      13     }
  • onDrawFrame(GL10 gl)                                          ---->画图
    • public void onDrawFrame(GL10 gl) {
              // 清除屏幕和深度缓存
              gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
              // 重置当前的模型观察矩阵
              gl.glLoadIdentity();
      
              // 左移 1.5 单位,并移入屏幕 6.0
              gl.glTranslatef(-2.0f, 0.0f, -6.0f);
      
              gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);
      
              // 启用定点数组
              gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
              // 设置三角形顶点
              gl.glVertexPointer(3, GL10.GL_FLOAT, 0, TrianBuffer);
              // 绘制三角形
              gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
      
              /* 渲染正方形 */
              // 重置当前的模型观察矩阵
              gl.glLoadIdentity();
      
              // 左移 1.5 单位,并移入屏幕 6.0
              gl.glTranslatef(2.0f, 0.0f, -6.0f);
              
              //设置颜色
              gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
              // 设置和绘制正方形
              gl.glVertexPointer(3, GL10.GL_FLOAT, 0, QuaterBuffer);
              gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
              // 取消顶点数组
              gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
          }
  • onSurfaceChanged(GL10 gl, int width, int height)     ---->当屏幕大小改变时被调用
    • public void onSurfaceChanged(GL10 gl, int width, int height) {
              float ratio = (float) width / height;
              gl.glViewport(0, 0, width, height);
              gl.glMatrixMode(GL10.GL_PROJECTION);
              gl.glLoadIdentity();
              gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
              gl.glMatrixMode(GL10.GL_MODELVIEW);
              gl.glLoadIdentity();
          }
  • 设置三角形与矩形的顶点数据
  • private float trianvertices[] = { 0.0f, 2.0f, 0.0f, // 上顶点
                -2.0f, -2.0f, 0.0f, // 坐下点
                2.0f, -2.0f, 0.0f, // 右下点
        };
        private FloatBuffer TrianBuffer;
        private float quatervertices[] = {
        1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, -1.0f, 0.0f, -1.0f, -1.0f, 0.0f
        };
        private FloatBuffer QuaterBuffer;
  • 构造函数把顶点数据转换成FloatBuffer类型。以便gl.glVertexPointer(int size,int type,int stride,Buffer pointer);
public OpenGLRenderer() {
        ByteBuffer tbb = ByteBuffer.allocateDirect(trianvertices.length * 4);
        tbb.order(ByteOrder.nativeOrder());
        TrianBuffer = tbb.asFloatBuffer();
        TrianBuffer.put(trianvertices);
        TrianBuffer.position(0);

        // 这里设置四边形的顶点数据
        ByteBuffer qbb = ByteBuffer.allocateDirect(quatervertices.length * 4);
        qbb.order(ByteOrder.nativeOrder());
        QuaterBuffer = qbb.asFloatBuffer();
        QuaterBuffer.put(quatervertices);
        QuaterBuffer.position(0);
    }

3.最终效果图:

原文地址:https://www.cnblogs.com/fanglove/p/2631639.html