zoukankan      html  css  js  c++  java
  • 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.最终效果图:

  • 相关阅读:
    redis搭建集群并用TreeSoft管理
    使用windows任务计划程序自动清除C盘缓存文件
    深入理解JavaScript事件循环机制
    redux源码解读(二)
    redux源码解读(一)
    create-react-app源码解读之为什么不搞个山寨版的create-react-app呢?
    深入理解CSS系列(二):为什么height:100%不生效?
    深入理解CSS系列(一):理解CSS的盒子模型
    搭建一个交互式的前端构建环境.md
    实习这件小事(一位大四狗的前端实习经历)
  • 原文地址:https://www.cnblogs.com/fanglove/p/2631639.html
Copyright © 2011-2022 走看看