Android音视频任务列表之(五)——学习 Android 平台 OpenGL ES API,了解 OpenGL 开发的基本流程,使用 OpenGL 绘制一个三角形

一.主要使用的方法

GLSurfaceView

1.setEGLContextClientVersion(int version)

设置GLES版本

2.setRenderer(Renderer renderer)

3. setRenderMode(int renderMode)

GLSurfaceView.Renderer

onSurfaceCreated()

在View的OpenGL环境被创建的时候调用。

onDrawFrame()

每一次View的重绘都会调用

GLES20

onSurfaceChanged()

如果视图的几何形状发生变化(例如,当设备的屏幕方向改变时),则调用此方法。

int shader = GLES20.glCreateShader(type);

创建shader

GLES20.glShaderSource(shader, shaderCode);

//将资源加入到着色器中,并编译

GLES20.glCompileShader(shader);

编译一个着色器对象

GLES20.glCreateProgram();

//创建一个空的OpenGLES程序

glAttachShader( int program,int shader)

将shader(定点着色器/片元着色器)加入到program

GLES20.glLinkProgram(int program)

链接着色器程序

GLES20.glUseProgram(int program)

使用程序

GLES20.glUniform4fv( int location,int count,float[] v, int offset)

设置绘制图形的颜色

GLES20.glDrawArrays(int mode,int first, int count)

绘制图形

GLES20.glDisableVertexAttribArray(int index)

禁止顶点数组的句柄

二.实现过程

1.GLSurfaceView相关

  glSurfaceView = (GLSurfaceView) findViewById(R.id.glSurfaceView);
        //GLContext设置OpenGLES2.0
        glSurfaceView.setEGLContextClientVersion(2);
        glSurfaceView.setRenderer(new TriangleRender());
        /*渲染方式,RENDERMODE_WHEN_DIRTY表示被动渲染,只有在调用requestRender或者onResume等方法时才会进行渲染。RENDERMODE_CONTINUOUSLY表示持续渲染*/
        glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

2、定义定点着色器和片元着色器

  private final String vertexShaderCode =
            "attribute vec4 vPosition; " +
                    "void main() {" +
                    "gl_Position = vPosition;" +
                    "}";
    private final String fragmentShaderCode =
            "precision mediump float;" +
                    "uniform vec4 vColor;" +
                    "void main() {" +
                    "  gl_FragColor = vColor;" +
                    "}";

3.定义图行

    //定义三角形
    static float triangleCoords[] = {
            0.5f,  0.5f, 0.0f, // top
            -0.5f, -0.5f, 0.0f, // bottom left
            0.5f, -0.5f, 0.0f  // bottom right
    };

4.将坐标写入ByteBuffer,并传递到OpenGL ES图形管道进行处理

             GLES20.glClearColor(1.0f,1f,0.5f,1.0f);
        //申请底层空间  顶点坐标个数 * 坐标数据类型 float 一个是 4 bytes
        ByteBuffer bb = ByteBuffer.allocateDirect(triangleCoords.length * 4);
        bb.order(ByteOrder.nativeOrder());
        //将坐标数据转换为FloatBuffer,传入OpenGL ES程序
        vertexBuffer = bb.asFloatBuffer();
        vertexBuffer.put(triangleCoords);//把顶点坐标信息数组triangleCoords[]存储到 FloatBuffer
        vertexBuffer.position(0);//设置从缓冲区的第一个位置开始读取顶点坐标信息

5.资源加入着色器并编译

    public int loadShader(int type, String shaderCode){
        int shader = GLES20.glCreateShader(type);
        GLES20.glShaderSource(shader, shaderCode);
        GLES20.glCompileShader(shader);
        return shader;
    }

6.创建程序并连接

         //创建一个空的OpenGLES程序
         mProgram = GLES20.glCreateProgram();
        //将顶点着色器加入到程序
        GLES20.glAttachShader(mProgram,vertexShader);
        //将片元着色器加入到程序中
        GLES20.glAttachShader(mProgram,fragmentShader);
        //连接 
        GLES20.glLinkProgram(mProgram);

7,使用程序绘制图行

  //将程序加入到OpenGLES2.0环境
        GLES20.glUseProgram(mProgram);

        //获取顶点着色器的vPosition成员句柄
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
        //启用三角形顶点的句柄
        GLES20.glEnableVertexAttribArray(mPositionHandle);
        //准备三角形的坐标数据
        GLES20.glVertexAttribPointer(mPositionHandle, 3,
                GLES20.GL_FLOAT, false,
                12, vertexBuffer);
        //获取片元着色器的vColor成员的句柄
        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
        //设置绘制三角形的颜色
        GLES20.glUniform4fv(mColorHandle, 1, color, 0);
        //绘制三角形
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
        //禁止顶点数组的句柄
        GLES20.glDisableVertexAttribArray(mPositionHandle);

三.结果
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值