初始化OpenGL
我们通过搭建一个简单OpenGL的项目,然后一步步细化,了解其中的奥秘。
书籍地址PDF:OpenGL ES2.0 应用开发实践指南Android卷
源码地址:https://github.com/maimingliang/OpenGLDemo
初始化GLSurfaceView
GLSurfaceView是一个视图,继承至SurfaceView,通过内嵌的“surface”的特定内存区域完成对OpenGL的渲染。
GLSurfaceView的特性:
- 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
- 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
- 用户自定义渲染器(render)。
- 让渲染器在独立的线程里运作,和UI线程分离。
- 支持按需渲染(on-demand)和连续渲染(continuous)。
- 一些可选工具,如调试。
创建GLSurfaceView实例:
mGLSurfaceView = new GLSurfaceView(this);
initGl();
setContentView(mGLSurfaceView);
private void initGl() {
//判断是否支持OpenGL 2.0
if (!Utils.isSuppostEs2(this)) {
Toast.makeText(this,"does suppost es 2.0 ",Toast.LENGTH_SHORT).show();
return;
}
mGLSurfaceView.setEGLContextClientVersion(2);
}
判断是否支持OpenGL 2.0
/**
*判断是否支持OpenGL 2.0
*/
public static boolean isSuppostEs2(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ConfigurationInfo deviceConfigurationInfo = activityManager.getDeviceConfigurationInfo();
int version = deviceConfigurationInfo.reqGlEsVersion;
if(version >= 0x20000){
return true;
}
return false;
}
处理一下生命周期事件
@Override
protected void onResume() {
super.onResume();
if (rendererSet) {
mGLSurfaceView.onResume();
}
}
@Override
protected void onPause() {
super.onPause();
if (rendererSet) {
mGLSurfaceView.onPause();
}
}
创建Renderer类
Renderer渲染器,GLSurfaceView会在一个单独的线程调用渲染器的方法,默认的情况下,GLSurfaceView会以显示设备刷新频率不断的渲染。
Renderer是一个接口,定义了三个方法:
onSurfaceCreated:当Surface被创建的时候,GLSurfaceView会调用这个方法 ,这发生在应用程序第一次运行的时候,并且,当设备唤醒或者用户从其他Activity切换回来时,这个方法也可能被调用。
onSurfaceChanged:在surface创建以后,每次surface尺寸的变化,这个方法都会别调用。比如横竖屏切换。
onDrawFrame:当绘制一帧时,这个方法就会别调用,在这个方法中,我们一定要绘制点东西,即使只是清空屏幕;因为这个方法调用后,渲染缓冲区就会交换显示到屏幕上,如果什么都没有绘制,屏幕可能出现闪烁的情况。
public class MyRender implements GLSurfaceView.Renderer {
private Context mContext;
public MyRender(Context context) {
mContext = context;
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
//设置清空屏幕用的颜色,分别对应红色、绿色和蓝色,最后一个为透明度。
GLES20.glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
//设置了视口尺寸,告诉 OpenGL 可以用来渲染的 surface 的大小。
GLES20.glViewport(0, 0, width, height);
}
@Override
public void onDrawFrame(GL10 gl) {
//会擦除屏幕上的所有颜色,并用 glClearColor 中的颜色填充整个屏幕。
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
}
}
Renderer与GLSurfaceView关联
private void initGl() {
if (!Utils.isSuppostEs2(this)) {
Toast.makeText(this,"does suppost es 2.0 ",Toast.LENGTH_SHORT).show();
return;
}
mGLSurfaceView.setEGLContextClientVersion(2);
//设置GLSurfaceView关联的Renderer
mGLSurfaceView.setRenderer(new AirHockeyRenderer(this));
rendererSet = true;
}
将程序运行起来了,你将看到一个完全红色的屏幕。
END
网友评论