1 前言

​ OpenGL(Open Graphics Library)是由 SGI 公司开发的一套 3D 图形软件接口标准,由于具有体系结构简单合理、使用方便、与操作平台无关等优点,OpenGL 迅速成为一种 3D 图形接口的工业标准,并陆续在各种平台上得以实现。

​ OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 的子集,相对 OpenGL 删减了一些低效能的操作方式,专为内嵌和移动设备设计的一个 2D/3D 轻量图形库。

​ 本文将通过绘制一个单色背景案例展示 OpenGL ES 的基本用法,项目目录如下:

img

2 案例

​ MainActivity.java

package com.zhyan8.first;

import androidx.appcompat.app.AppCompatActivity;

import android.opengl.GLSurfaceView;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    private GLSurfaceView mGlSurfaceView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mGlSurfaceView = new MyGLSurfaceView(this);
        setContentView(mGlSurfaceView);
        mGlSurfaceView.setRenderer(new MyRender());
    }

    @Override
    protected void onResume() {
        super.onResume();
        mGlSurfaceView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mGlSurfaceView.onPause();
    }
}

​ MyGLSurfaceView.java

package com.zhyan8.first;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.AttributeSet;

public class MyGLSurfaceView extends GLSurfaceView {
    public MyGLSurfaceView(Context context) {
        super(context);
        setEGLContextClientVersion(3);
    }

    public MyGLSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setEGLContextClientVersion(3);
    }
}

​ MyRender.java

package com.zhyan8.first;

import android.graphics.Color;
import android.opengl.GLES30;
import android.opengl.GLSurfaceView;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

public class MyRender implements GLSurfaceView.Renderer {
    private float[] colorArr;

    public MyRender() {
        colorArr = getColorArr(Color.CYAN);
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig eglConfig) {
        //设置背景颜色
        GLES30.glClearColor(colorArr[0], colorArr[1], colorArr[2], colorArr[3]);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        //设置视图窗口
        GLES30.glViewport(0, 0, width, height);
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        //将颜色缓冲区设置为预设的颜色
        GLES30.glClear(GL10.GL_COLOR_BUFFER_BIT);
    }

    private float[] getColorArr(int color) {
        float[] colorArr = new float[4];
        colorArr[0] = (float) Color.red(color) / 255;
        colorArr[1] = (float) Color.blue(color) / 255;
        colorArr[2] = (float) Color.green(color) / 255;
        colorArr[3] = (float) Color.alpha(color) / 255;
        return colorArr;
    }
}

运行结果:

img

​ 声明:本文转自【OpenGL ES】第一个案例