zoukankan      html  css  js  c++  java
  • OpenGL学习(一)

      OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。在游戏和特效领域,使用非常广泛。在移动平台上Android支持了OpenGL ES。今天,我开始学习OpenGL ES 并在此记录学习的过程。

      Android提供了GLSurfaceView,是一个支持OpenGL ES的控件,封装了OpenGL的复杂流程。今天记录一下它的使用方法。

      

    public class MainActivity extends AppCompatActivity {
    
        private GLSurfaceView glSurfaceView;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            glSurfaceView = new GLSurfaceView(this);
            glSurfaceView.setRenderer(new GLSurfaceViewRender());
            setContentView(glSurfaceView);
    
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            glSurfaceView.onResume();
        }
    
    
        @Override
        protected void onPause() {
            super.onPause();
            glSurfaceView.onPause();
        }
    
    
    }

      GLSurfaceViewRender是我们自定义的类,它实现了GLSurfaceView.Renderer的接口,封装了GLSurfaceView的相关操作和生命周期。

      

    public class GLSurfaceViewRender implements GLSurfaceView.Renderer {
    
        private float[] mTriangleArray = {
                // X, Y, Z 这是一个等边三角形
                -0.5f, -0.25f, 0, 0.5f, -0.25f, 0, 0.0f, 0.4f, 0 };
    
    
        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            // 设置背景颜色
            gl.glClearColor(0.9f, 0.8f, 1f, 0.9f);
            // 启用顶点数组(否则glDrawArrays不起作用)
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        }
    
        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            // 设置输出屏幕大小
            gl.glViewport(0, 0, width, height);
    
    
        }
    
        @Override
        public void onDrawFrame(GL10 gl) {
            // 清除屏幕和深度缓存(如果不调用该代码, 将不显示glClearColor设置的颜色)
            // 同样如果将该代码放到 onSurfaceCreated 中屏幕会一直闪动
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
            // 获取颜色
            gl.glColor4f(1.0f, 0.4f, 0.4f, 0.8f);
            // 获取形状数组
            FloatBuffer mTriangleBuffer = BufferUtil
                    .floatToBuffer(mTriangleArray);
            // 每个点用几个数字描述;
            // 每个顶点坐标的变量类型;
            // 取数据时的间隔,因为有些人习惯把颜色数据也放里边,如果这样,你需要跳过这些点.意思就是每隔stride取一个点;
            // 每个顶点的坐标
            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);
            /**
             * 参数1:有三种取值
             1.GL_TRIANGLES:每三个顶之间绘制三角形,之间不连接
             2.GL_TRIANGLE_FAN:以V0V1V2,V0V2V3,V0V3V4,……的形式绘制三角形
             3.GL_TRIANGLE_STRIP:顺序在每三个顶点之间均绘制三角形。这个方法可以保证从相同的方向上所有三角形均被绘制。以V0V1V2,V1V2V3,V2V3V4……的形式绘制三角形
    
             参数2:从数组缓存中的哪一位开始绘制,一般都定义为0
             参数3:顶点的数量
             */
            gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
            //  加载glLoadIdentity(),等于是将之前矩阵变换导致变化过的栈顶矩阵重新归位,置为单位矩阵!等于是之前的矩阵变换带来的影响到此为止了!
            gl.glLoadIdentity();
            // 平移 (矩阵相乘)
            gl.glTranslatef(-0.2f, 0.3f, 0f);
    
        }
    
        static class BufferUtil {
            public static FloatBuffer mBuffer;
    
            public static FloatBuffer floatToBuffer(float[] a) {
                // 先初始化buffer,数组的长度*4,因为一个float占4个字节
                ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);
                // 数组排序用nativeOrder
                mbb.order(ByteOrder.nativeOrder());
                mBuffer = mbb.asFloatBuffer();
                mBuffer.put(a);
                mBuffer.position(0);
                return mBuffer;
            }
        }
    }

      以上是用OpenGL 画一个三角形的过程,注释记录详细。

      初步的,就是这样。

      Done~

  • 相关阅读:
    wx_sample.php

    手机装linux系统
    MySQL导入导出命令
    PHP对表单提交特殊字符的过滤和处理
    sublime开启php自动代码补全
    寻找Linux单机负载瓶颈
    怎样成为PHP 方向的一个合格的架构师
    说说大型高并发高负载网站的系统架构
    数据库水平分割,垂直分割,库表散列浅谈
  • 原文地址:https://www.cnblogs.com/fishbone-lsy/p/5507226.html
Copyright © 2011-2022 走看看