如今VR这么火,感觉有必要先把OpenGL学好,为以后转VR奠定一些基础。一年前,接触过Android的OpenGL,当时是实现了在Android上显示标准的3D文件(STL格式)。现在打算整理一下OpenGL相关知识,后续会有相关的系列文章。本文为后面文章铺垫,让大家对OpenGL代码编写有个总体上的认识。

1 检测设备是否支持OpenGL

Android中,有个专门用于显示OpenGL的3D图像View:GLSurfaceView。GLSurfaceView会处理OpenGL初始化过程中比较基本的操作,如配置显示设备,以及在后台线程中渲染。说的太正式了哈,其实不用太在乎它,就把它当当成是一个SurfaceView就好,因为其实它的用法跟SurfaceView很像(然而,它就是继承自SurfaceView~)。

接下来开始创建GLSurfaceView。在使用OpenGL时,我们首先得判断当前设备是否支持OpenGL(其实大部分手机都是支持的啦~),由于各种设备都可能支持Android系统,其实还是有必要判断一下。因为我们现在基本上用到的是OpenGL ES 2.0,我们要验证的是检查系统是否实际支持2.0版本。

final ActivityManager activityManager=(ActivityManager)getSystemService(ACTIVITY_SERVICE);

final ConfigurationInfo configurationInfo=activityManager.getDeviceConfigurationInfo();

boolean supportsEs2=configurationInfo.reqGlEsVersion>=0x2000;

由于这段代码不能很好的在模拟器上工作(GPU模拟部分有缺陷),得要稍微修改一下,使之能在模拟器上正常工作

boolean 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 boolean supportsEs2;

private GLSurfaceView glSurfaceView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

checkSupported();

if (supportsEs2) {

glSurfaceView = new GLSurfaceView(this);

glSurfaceView.setRenderer(new GLRenderer());

setContentView(glSurfaceView);

} else {

setContentView(R.layout.activity_main);

Toast.makeText(this, "当前设备不支持OpenGL ES 2.0!", Toast.LENGTH_SHORT).show();

}

}

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;

}

什么?这么简单,难道这样就能显示3D模型?可是并没有看到3D模型图形在哪里啊!别着急,看看第9行代码,有个setRenderer()函数,里面需要传入一个Renderer对象,那么什么是Renderer呢?前面提到GLSurfaceView是用于显示3D模型的视图,如果说GLSurfaceView是画布,那么,光有一块白纸是没用的,得要在白纸上画图,通过什么画图呢?就是接下来要说的Renderer。Renderer是一个接口,它主要包含3个抽象函数:onSurfaceCreated、onDrawFrame、onSurfaceChanged;从名字就可以看出,分别是在SurfaceView创建时调用、在绘制图形时调用以及在视图大小发生改变时调用。看看我们的GLRenderer对象是怎么定义的:

/**

* Package com.hc.opengl

* Created by HuaChao on 2016/7/27.

*/

public class GLRenderer implements GLSurfaceView.Renderer {

@Override

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

}

@Override

public void onSurfaceChanged(GL10 gl, int width, int height) {

}

@Override

public void onDrawFrame(GL10 gl) {

}

}

这里啥也没干,所以你的屏幕上面啥都没有~但是大致框架已经搭建好了。另外,还需要注意一点,就是防止我们在切换程序时,OpenGL还在绘制图形导致程序崩溃,因此我们还需要根据Activity的生命周期针对GLSurfaceView做一些处理:

@Override

protected void onPause() {

super.onPause();

if (glSurfaceView != null) {

glSurfaceView.onPause();

}

}

@Override

protected void onResume() {

super.onResume();

if (glSurfaceView != null) {

glSurfaceView.onResume();

}

}

ok,到目前为止,这个框架算是搭建好了,接下来,让我们把战场转移到Renderer对象上去吧!

2 Renderer显示背景颜色

在绘制3D模型时,我们首先要对画板的背景颜色绘制好,颜色可以随便选。glClearColor函数是设置清屏的颜色,参数分别对应RGBA,我们设置为红色就是glClearColor(1f, 0f, 0f, 0f);,为啥红色是1呢?而不是我们平时所熟知的255,请注意:在使用OpenGL时,很多地方采用的参数变化范围都是从0到1,比如在贴纹理的时候选择图片区域也是[0,1]。也就是说,rgba的取值都是从0~1。然后是设置视角窗口大小glViewport,其实就是决定绘制的矩形区域的大小,当然并不是这么简单,后面我会详细讲,目前就可以把它理解为绘制的区域,在GLSurfaceView窗口大小发生变化时我们动态改变视角窗口。最后就是真正的绘制图形啦,我们先啥也不干,就针对画板“刷一次油漆”,把画板背景颜色设置为红色,glClear(GL10.GL_COLOR_BUFFER_BIT)的意思是,使用glClearColor函数所设置的颜色进行清屏。

@Override

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

gl.glClearColor(1f, 0f, 0f, 0f);

}

@Override

public void onSurfaceChanged(GL10 gl, int width, int height) {

gl.glViewport(0, 0, width, height);

}

@Override

public void onDrawFrame(GL10 gl) {

gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

}

运行一下吧,是不是看到满满的红色~。如果你的模拟器没有显示效果:请检查“Use Host GPU”选项已经勾选。如果已经勾选,那就在 glSurfaceView.setRenderer(new GLRenderer());代码之前添加代码:glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);

设置清屏颜色

目前我们把基本框架写好了,但是还没有绘制模型图像,其实,我们在显示模型时,主要的工作就是集中在Renderer,重写里面的3个重要函数,基本上就可以把一个模型显示出来。下一篇文章中,我们一起学习如何显示简单的图形。

android opengl 简书,Android OpenGL入门相关推荐

  1. android 购物车 简书,Android仿饿了么购物车效果

    先看下效果图: ezgif-1-8f133ca916.gif 1.首先列表布局采用Recycleview android:id="@+id/container" android:l ...

  2. android matrix 简书,[Android] ImageView ScaleType完全解析

    ImageView有一个ScaleType的属性,该属性决定了图片在ImageView上的展现形式,包括:是否进行缩放.如何进行缩放.缩放之后图片的摆放位置等等.官方介绍如下: Options for ...

  3. android spinner 简书,Android NiceSpinner

    NiceSpinner 是 Android 端的一款第三方控件,自带箭头动画效果 真的是简单又好用哦!有需要的小伙伴们可以试试啦. 效果图如下: image 1. 导入模块 在 Github 下载并导 ...

  4. android realm 简书,Realm使用(入门篇)

    Realm 介绍 什么是ORM? Android原生操作数据库的方式是这样的:首先定义一个类继承SQLiteOpenHelper,重写onCreate和onUpdate,后续对数据库的增删改查以及创建 ...

  5. android room 简书,Android Room 的坑

    在添加依赖时,官网给出的是: def room_version = "2.0.0-beta01" implementation "androidx.room:room-r ...

  6. android 音乐 简书,Android音频开发(7):音乐可视化-FFT频谱图

    Android 音频开发 目录 一.演示 image 二.实现 实现流程: 使用MediaPlayer播放传入的音乐,并拿到mediaPlayerId 使用Visualizer类拿到拿到MediaPl ...

  7. android 心跳 简书,Android Socket保持心跳长连接,断线重连

    昨天三点钟才睡觉的,现在胸口感觉闷闷的,兄弟们,我是不是要GG了?如果我G了,求大佬们给我烧个女朋友, ss.gif 1.在使用Socket连接客户端和服务器端的时候,如果服务端断开了连接,我们客户端 ...

  8. android zxing简书,Android集成zxing 版本3.4.1

    第一步:去官网下载最新jar 或者 'implementation 'com.google.zxing:core:3.4.1''引入项目. 如下图: yhx.png 如何查看最新版本: yhx.png ...

  9. android realm 简书,android 数据库SQLite realm

    一.SQLite android内置了数据库SQLite,这是一款轻量级的关系型数据库,通常只需要几百K的内存.数据库文件存放在/data/data//databases/目录下. 为了方便管理数据库 ...

最新文章

  1. linux脚本判断流程控制,Shell 脚本-6- 流程控制之判断分支
  2. 实例28:python
  3. react中对props.children进行操作
  4. 每周更新:React UI 库、WebStorm 2019.1.1、PaySDK v2.0.1和Spring Boot 2.2 第二个里程碑 M2等更新发布
  5. cmake Can‘t find third_party/gtest
  6. 关灯游戏 Lights out (二)(首行枚举+位运算,搜索全部解)
  7. 公差与配合查询计算过程讲解
  8. 阿帕奇服务器搭建网站,使用Apache搭建Web网站服务器
  9. 荣耀笔记本pro linux版本,荣耀MagicBook Pro锐龙版发布:首发锐龙7 3750H、还有Linux版...
  10. 耗时5小时用纯HTML和CSS写成的博学谷
  11. Mapping Spiking Neural Networks的论文汇总以及思考
  12. tableau和oracle dv,比较Power BI和Tableau,好比用奔驰对比奥迪
  13. 如何将动图中多余的去掉?教你快速裁剪动图
  14. val和var的区别
  15. 朴素贝叶斯+Python3实现高斯朴素贝叶斯
  16. AWS DeepRacer re:Invent 2018赛道reward function奖励函数
  17. 支付宝扫码验签实例php,PHP 支付宝支付,支付宝回调
  18. Doris FE启动流程源码详细解析
  19. Meth | elementary OS常用配置
  20. 酒店管理系统代码 java_酒店管理系统源代码

热门文章

  1. ubuntu20.04 + kiosk + chrome打造一体机系统
  2. 使用Java合并excel的sheet的操作
  3. sfm-learner学习心得
  4. 面试算法高频压轴题——灯泡开关问题
  5. 谷歌打不开了吧,访问谷歌镜像Glgoo.com吧_我是亲民_新浪博客
  6. React:setting Styles+ Radium
  7. 如果应用闪退,怎么获取相关日志?
  8. 使用JNI造成安卓应用闪退
  9. Python程序设计(下)
  10. amCharts 5.2.2 Crack