Android OpenGL入门
来源:互联网 发布:欧洲难民感恩 知乎 编辑:程序博客网 时间:2024/06/16 10:25
OpenGL简介
OpenGL可以绘制2D和3D的图形,如今,VR很火,所以有关3D图形绘制可能会尤为重要,体现:前几天比较火的游戏pokemon go,当然它不是用OpenGL做的,但是很明显,3D是以后开发的趋势,所以我们应该了解并且学习,在绘制3D图形之前,你必须得了解和会使用OpenGL,OK,我们一起学习下吧。
支持
OpenGL ES 支持的基本图形为 点 Point, 线 Line, 和三角形 Triangle ,其它所有复制图形都是通过这几种基本几何图形组合而成。
1,检测设备是否支持OpenGL
在Android中,有个专门支持显示3D和2D图形的View:GLSurfaceView,GLSurfaceView的用法和SurfaceView的用法相似,因为它也是继承自SurfaceView的,用于显示图像,第一步就是创建GLSurfaceView,但是在创建之前最好判断一下手机或者模拟器是否支持OpenGL,实际上大多数手机是支持OpenGL的,所以这一步我们主要是判断是否支持OpenGL ES 2.0。
private Button firstDemo; private boolean supportsEs2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); checkSupported(); firstDemo = (Button) findViewById(R.id.btn_first); firstDemo.setOnClickListener(this); } @Override public void onClick(View view) { if (supportsEs2) { Intent intent = new Intent(); switch (view.getId()) { case R.id.btn_first: intent.setClass(MainActivity.this, FirstActivity.class); break; } startActivity(intent); } else { Toast.makeText(this, "当前设备不支持OpenGL ES 2.0!", Toast.LENGTH_SHORT).show(); } } /** * 检测手机或者模拟器是否支持OpenGL2.0 */ private void checkSupported() { ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo(); supportsEs2 = configurationInfo.reqGlEsVersion >= 0x2000; boolean isEmulator = Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1 && (Build.FINGERPRINT.startsWith("generic") || Build.FINGERPRINT.startsWith("unknown") || Build.MODEL.contains("google_sdk") || Build.MODEL.contains("Emulator") || Build.MODEL.contains("Android SDK built for x86")); supportsEs2 = supportsEs2 || isEmulator; }
然后创建GLSurfaceView
private GLSurfaceView glSurfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); glSurfaceView = new GLSurfaceView(this); //设置渲染器 glSurfaceView.setRenderer(new GLRenderer()); setContentView(glSurfaceView); } @Override protected void onResume() { super.onResume(); if (glSurfaceView != null) { glSurfaceView.onResume(); } } @Override protected void onPause() { super.onPause(); //防止activity不可见时还在绘制图形导致程序崩溃 if (glSurfaceView != null) { glSurfaceView.onPause(); } }
可以将GLSurfaceView理解成画布,然后就是在画布上画图形了,用什么画呢?注意下面这行代码
glSurfaceView.setRenderer(new GLRenderer());
Renderer是一个接口,它主要包含3个抽象函数:
- onSurfaceCreated 在SurfaceView创建时调用
- onDrawFrame 在绘制图形时调用
- onSurfaceChanged 在视图大小发生改变时调用
GLRenderer是我们自定义的,他是实现了Renderer接口的,并且实现上面三个方法,以后绘制图形就在这个类里面,来看下怎么定义这个类:
/** * Created by Fussen on 16/8/22. */public class GLRenderer implements GLSurfaceView.Renderer { @Override public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) { } @Override public void onSurfaceChanged(GL10 gl10, int i, int i1) { } @Override public void onDrawFrame(GL10 gl10) { }}
写到这,大致框架就已经搭建好了,下面就是我们开始绘制图形的时候了,但是在绘制之前要注意,在我们的activity onPause和onResume的时候OpenGL还在绘制图形导致程序崩溃,所以我们还要做的就是在activity的生命周期里对GLSurfaceView做一些处理。
@Override protected void onResume() { super.onResume(); if (glSurfaceView != null) { glSurfaceView.onResume(); } } @Override protected void onPause() { super.onPause(); //防止activity不可见时还在绘制图形导致程序崩溃 if (glSurfaceView != null) { glSurfaceView.onPause(); } }
接下来就开始对GLRenderer类进行操作了
Renderer绘制背景色
先上代码,然后在解释
/** * Created by Fussen on 16/8/22. */public class GLRenderer implements GLSurfaceView.Renderer { @Override public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) { //设置清屏的颜色(背景色),参数分别对应RGBA(红色) gl10.glClearColor(1f, 0f, 0f, 0f); } /** * 在绘制图形时调用 * * @param gl10 * @param width * @param height */ @Override public void onSurfaceChanged(GL10 gl10, int width, int height) { //设置视角窗口大小 glViewport gl10.glViewport(0,0,width,height); } /** * 在视图大小发生改变时调用 * * @param gl10 */ @Override public void onDrawFrame(GL10 gl10) { //使用glClearColor函数所设置的颜色进行清屏。 gl10.glClear(GL10.GL_COLOR_BUFFER_BIT); }
gl10.glClearColor()是设置清屏的颜色,参数分别是RGBA,它的取值范围是在0-1之间,gl10.glClearColor(1f, 0f, 0f, 0f)设置的就是红色,在OpenGL中很多参数的范围都是0-1之间。
然后是设置窗口的大小glViewport,就是决定绘制的矩形区域的大小,在GLSurfaceView窗口大小发生变化时我们动态改变视角窗口。这时候就开始真正的绘制图形了,我们暂时先给他一个红色的背景,把画板背景颜色设置为红色,glClear(GL10.GL_COLOR_BUFFER_BIT)的意思是,使用glClearColor函数所设置的颜色进行清屏。
最终效果
写到这里我们就算完成了一个小Demo,用OpenGL绘制了一个红色背景,当然我们要做的不止这些,今天就学习到这吧,以后我们绘制图形的代码就都会写在GLRenderer这个类里面。
- Android OpenGL 入门实例
- Android OpenGL ES 入门
- Android OpenGL入门
- Android OpenGL入门
- android-opengl入门
- Android OpenGL入门
- Android OpenGL基础入门
- 1.android opengl 入门之一
- android opengl es入门系列
- android opengl es 入门概述
- Android OpenGL ES 开发入门
- android opengl es入门示例
- Android 中的 OpenGL 简单入门(上)
- Android 中的 OpenGL 简单入门 (下)
- Android OpenGL ES 2.0入门学习 1
- OpenGL入门
- OpenGL 入门
- Opengl入门
- Android ViewPager加Fragment实现滑动或者点击页面切换
- 贪吃蛇self3
- 五种ARP学习
- mock代码片断1
- spring session 做session共享
- Android OpenGL入门
- 我的计算几何之路
- makefile ifeq多条件逻辑或
- 木雨音乐 项目开发(九)网络推荐——设置九大榜单
- jprofiler9.2注册码
- x和y是递增/递减之前
- Android Studio引用第三方项目,Jar包,AAR包总结
- C++文件读取与字符分割
- Sencha Test 使用示例 – Part 2