资讯详情

Android音视频任务列表之(五)——学习 Android 平台 OpenGL ES API,了解 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);

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

标签: fv1连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台