初始化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

更多相关文章

  1. Android(安卓)DataBinding 使用指南
  2. Android通过json向MySQL中读写数据的方法详解【读取篇】
  3. android 获得屏幕、视图、任务栏、状态栏的高宽以及屏幕的设置
  4. android 中的Main调试方法
  5. Android(安卓)图片处理之图片叠加--Bitmap
  6. 实现图片浏览,改变透明度的方法
  7. Android(安卓)给图标着色的方法
  8. Android(安卓)Ams浅析
  9. Android之开源框架NineOldAndroids动画库

随机推荐

  1. android平板上的GridView视图缓存优化
  2. 浅谈android的selector背景选择器
  3. Android中RelativeLayout各个属性的含义
  4. Android(安卓)LinearLayout的android:lay
  5. Android消息机制——Handler、Looper、Me
  6. Android开发者网址导航
  7. Android事件处理
  8. Android之——自动挂断电话的实现
  9. android animation动画
  10. Android编译系统分析大全