Android(安卓)OpenGL ES 读书笔记(1)
16lz
2021-01-26
初始化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
更多相关文章
- Android(安卓)DataBinding 使用指南
- Android通过json向MySQL中读写数据的方法详解【读取篇】
- android 获得屏幕、视图、任务栏、状态栏的高宽以及屏幕的设置
- android 中的Main调试方法
- Android(安卓)图片处理之图片叠加--Bitmap
- 实现图片浏览,改变透明度的方法
- Android(安卓)给图标着色的方法
- Android(安卓)Ams浅析
- Android之开源框架NineOldAndroids动画库