当前位置: 首页 > >

Android OpenGL ES 开发(一)? 环境搭建

发布时间:

?


我的视频课程:《Android C++ OpenGL 教程》

????? ?


对于Opengl/sl/cv/...系列相信大家也不陌生,我在前面博客也介绍了OpenSL ES的一些知识和使用方法,让我们对OpenSL ES有了一定的了解。从今天开始我将给大家带来一系列的Android中OpenGL ES的使用方法(主要是基于2D*面图形的)。


一、OpenGL ES是什么?


我总结的就是:OpenGL ES 是一个嵌入式的(2D/3D)图形处理库。详细请见百度百科。


二、OpenGL ES能做什么?


????? ?就拿我们的手机显示系统来说,我们的屏幕显示一个UI界面,其绘制就是OpenGL ES来完成的。由CPU计算每个控件的绘制坐标和颜色等,当这些计算完了后就交给OpenGL ES来调用GPU(显卡),通过GLSL(着色器程序)来绘制画面,这样就把我们的UI界面绘制出来了。其他的还有:游戏、图片滤镜、视频等都可以用OpenGL来处理。


三、Android中的OpenGL ES


????? ?在Android中使用OpenGL ES有2中方法:


????? ?1、一个是在Java层调用OpenGL ES库;


????? ?2、另一个就是在C/C++层调用OpenGL ES库。


不过这2中方法调用OpenGL ES 的方式和过程都基本一致,所以博客主要以Java方式来讲解OpenGL ES的使用,后面如果有需要可能会讲一下C/C++的实现方法。


四、Android中使用OpenGL ES的方式(先作介绍,后续都会讲解,概念不懂可以暂时忽略)


????? ?在Android中使用OpenGL ES的方式也有2中:


????? ?1、自定义类直接继承GLSurfaceView,然后我们重点就主要写Render方法就行。


????? ?2、自己搭建EGL(是OpenGL ES和本地窗口系统的接口,不同*台上EGL配置是不一样的,而OpenGL的调用方式是一致的,就是说:OpenGL跨*台就是依赖于EGL接口)环境,然后开启自己的EGL线程,后续使用和继承GLSurfaceView基本是一致的。


注意:OpenGL ES整个其实就是一个大的状态机,我们通过改变其状态(调用相关的API)就能控制其后续的渲染操作。


五、Android中OpenGL ES的初体验(v2.0)


1、自定义类继承GLSurfaceView


2、实现接口GLSurfaceView.Renderer,其有3个实现方法,分别是:


2.1:void onSurfaceCreated(GL10 gl, EGLConfig config); 用于我们的Surface创建时初始化一些设置。


2.2:void onSurfaceChanged(GL10 gl, int width, int height); 用于我们的Surface大小发生改变时来更改我们自己的绘制大小。


2.3:void onDrawFrame(GL10 gl); 用于我们实际绘制操作。


注意:GLSurfaceView.Renderer的方法都是在自己的EGL线程中实现的,超出这个线程绘制是不起作用的


六、实例-把我们的窗口绘制成红色(rgb:f00,在OpenGL中f就是1,0也是0,所以红色就是:rgb:100)


1、自定义WlGLSurfaceView类继承GLSurfaceView类:


package com.ywl5320.opengldemo;

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

public class WlGLSurfaceView extends GLSurfaceView{

public WlGLSurfaceView(Context context) {
this(context, null);
}

public WlGLSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
setEGLContextClientVersion(2);//设置opengl es版本为2.0
setRenderer(new WlRender());//为glsurfaceview设置render
}
}

继承GLSurfaceView,我们只是在构造函数中设置了当前opengl es 使用的版本,这里是设置的2.0版本(setEGLContextClientVersion(2)),然后把我们的Render设置给当前自定义的WlGLSurfaceView(setRenderer(new WlRender())),接下来我们就来实现WlRender。


2、实现GLSurfaceView.Render接口:


package com.ywl5320.opengldemo;

import android.opengl.GLES20;
import android.opengl.GLSurfaceView;

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

public class WlRender implements GLSurfaceView.Renderer{

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {

}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
GLES20.glViewport(0, 0, width, height);
}

@Override
public void onDrawFrame(GL10 gl) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);//用红色来清屏(屏幕将变成红色)
}
}

这里需要实现onSurfaceCreated、onSurfaceChanged、onDrawFrame三个方法。


2.1、在方法onSurfaceCreated中是做初始化工作,这里我们暂时用不到。


2.2、在方法onSurfaceChanged中我们调研OpenGL ES的方法:GLES20.glViewport(0, 0, width, height);设置OpenGL ES渲染窗口的大小,前2个参数分别是起点x和y的值,第三个参数是窗口宽(width),第四个参数是窗口高(height)这里回调方法里面的宽高就是当前WlGLSurfaceView的宽高。


2.3、在方法onDrawFrame中就是我们需要绘制的操作了,这里执行了两个操作:第一个是颜色缓冲清屏(GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)),除了颜色缓存清屏以外,常用的还有深度缓冲清屏(GLES20.GL_DEPTH_BUFFER_BIT),不过这个主要用在3d渲染里面,2d渲染不会用到;第二个是用指定的颜色来清屏(GLES20.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);),效果就是用什么颜色后,屏幕就会变成什么颜色,颜色格式是 rgba的,每个分量取值范围都是(0~1),比如这里的红色就是:(1.0f, 0.0f, 0.0f, 1.0f)。


3、Activity中布局调用:



xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

android:layout_width="match_parent"
android:layout_height="match_parent" />


因为我们在WlGLSurfaceView里面就进行了绘制,所在这里直接在布局中加入WlGLSurfaceView就行,然后运行程序就会出现效果的。


4、运行结果:



?


好了,OpenGL ES第一次接触就到这里,在后面博客会慢慢深入学*的,本实例下载地址:


GitHub:Android-OpenGL-ES


?


?


?


?


?



友情链接: