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 画一个三角形的过程,注释记录详细。编程语言

  初步的,就是这样。ide

  Done~学习

相关文章
相关标签/搜索