自己学习练手。
1.在配置文件中添加如下代码
<uses-feature android:glEsVersion="0x00020000" android:required="true" /> <supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" /> 2.定义简单的surfaceview class MySurfaceView extends GLSurfaceView { private final MyGLRenderer mRenderer; public MySurfaceView(Context context) { super(context); // 创建一个 OpenGL ES 2.0 上下文 setEGLContextClientVersion(2); mRenderer = new MyGLRenderer(); // 为 GLSurfaceView 设置一个渲染器 setRenderer(mRenderer); } }3.定义一个渲染器 class MyGLRenderer implements GLSurfaceView.Renderer{ private Triangle mTriangle; private Square mSquare; @Override /** *设置视图的OpenGL ES环境 */ public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) { // 设置背景颜色 GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 初始化三角形 mTriangle = new Triangle(); } @Override /** * 视图的几何变化就调用 */ public void onSurfaceChanged(GL10 gl10, int width, int height) { GLES20.glViewport(0, 0, width, height); Log.e("onsurfaceChanged","onsurfaceChanged"); } @Override /** * 重绘视图 */ public void onDrawFrame(GL10 gl10) { // 重绘背景颜色 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); mTriangle.draw(); } public static int loadShader(int type, String shaderCode){ //创建顶点着色器类型(GLES20.GL_VERTEX_SHADER) // 或片段着色器类型(GLES20.GL_FRAGMENT_SHADER) int shader = GLES20.glCreateShader(type); //将源代码映射到着色器并编译它 GLES20.glShaderSource(shader, shaderCode); GLES20.glCompileShader(shader); return shader; } } 4.定义实现图形:三角形 public class Triangle { 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;" + "}"; private FloatBuffer vertexBuffer; // 这个数组中每个顶点的坐标数 static final int COORDS_PER_VERTEX = 3; static float triangleCoords[] = { // 以逆时针顺序: 0.0f, 0.622008459f, 0.0f, // top -0.5f, -0.311004243f, 0.0f, // bottom left 0.5f, -0.311004243f, 0.0f // bottom right }; // 设置 颜色为红色、绿色、蓝色和alpha(不透明度)值 float color[] = {0.63671875f, 0.76953125f, 0.22265625f, 1.0f}; private final int mProgram; private int mPositionHandle; private int mColorHandle; private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX; private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex public Triangle() { // 为形状坐标初始化顶点字节缓冲区 ByteBuffer bb = ByteBuffer.allocateDirect( // (每个浮点数* 4字节) triangleCoords.length * 4); // 使用设备硬件的本地字节顺序 bb.order(ByteOrder.nativeOrder()); // 从ByteBuffer创建一个浮点缓冲区 vertexBuffer = bb.asFloatBuffer(); // 将坐标添加到FloatBuffer vertexBuffer.put(triangleCoords); //设置缓冲区以读取第一个坐标 vertexBuffer.position(0); //创建着色器 int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode); int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); // 创建空的OpenGL ES程序 mProgram = GLES20.glCreateProgram(); // 添加顶点着色器到程序 GLES20.glAttachShader(mProgram, vertexShader); //添加片段着色程序到程序 GLES20.glAttachShader(mProgram, fragmentShader); //创建OpenGL ES程序执行程序 GLES20.glLinkProgram(mProgram); } public void draw() { // 添加程序到OpenGL ES环境 GLES20.glUseProgram(mProgram); // 处理顶点着色器的vPosition成员 mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition"); // 为三角形顶点启用句柄 GLES20.glEnableVertexAttribArray(mPositionHandle); // 准备三角形坐标数据 GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer); // 处理片段着色器的vColor成员 mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor"); // 为绘制三角形设置颜色 GLES20.glUniform4fv(mColorHandle, 1, color, 0); // 画一个三角形 GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); // 禁用顶点数组 GLES20.glDisableVertexAttribArray(mPositionHandle); } }5.调用surfaceview public class MainActivity extends AppCompatActivity { private SurfaceView mysSurfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mysSurfaceView = new MySurfaceView(this); setContentView(mysSurfaceView); } }