Android开发经验谈Android知识程序员

Android OpenGL ES 读书笔记(1)

2017-08-20  本文已影响348人  maimingliang

初始化OpenGL

我们通过搭建一个简单OpenGL的项目,然后一步步细化,了解其中的奥秘。

书籍地址PDF:OpenGL ES2.0 应用开发实践指南Android卷

源码地址:https://github.com/maimingliang/OpenGLDemo

初始化GLSurfaceView

GLSurfaceView是一个视图,继承至SurfaceView,通过内嵌的“surface”的特定内存区域完成对OpenGL的渲染。

GLSurfaceView的特性:

  1. 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
  2. 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
  3. 用户自定义渲染器(render)。
  4. 让渲染器在独立的线程里运作,和UI线程分离。
  5. 支持按需渲染(on-demand)和连续渲染(continuous)。
  6. 一些可选工具,如调试。

创建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

上一篇下一篇

猜你喜欢

热点阅读