当前位置:网站首页>OpenGL es 初识
OpenGL es 初识
2022-07-31 09:09:00 【光临天下】
在Android下的第一个OpenGL es 2.0的项目,我们从最简单开始。使用OpenGL es改变屏幕的颜色。
虽然简单,但是我看的了好多资料基本都没有讲这些基础,上来就画个三角形,搞得看完了。我发现什么都没有记住,到时在复制粘贴。
既然是要做最好,肯定要和别人不一样,基础其实很重要的。
一、创建OpenGL es项目
接下你将学习OpenGL es 2.0对Android入门,是一些比较简单的内容,你可以很全面的了解OpenGL es在Android下使用。
1.检查手机是否支持OpenGL es 2.0
- OpenGL ES 1.0和1.1 - Android 1.0及更高版本支持此API规范。
- OpenGL ES 2.0 - Android 2.2(API级别8)及更高版本支持此API规范。
- OpenGL ES 3.0 - Android 4.3(API级别18)及更高版本支持此API规范。
- OpenGL ES 3.1 - Android 5.0(API级别21)及更高版本支持此API规范。
我们学习的是OpenGL 2.0 ,可以看出OpenGL es 2.0 对Android 手机的要求,并不高。现在4.4的系统谷歌都推荐放弃了。
但是,我们写的App都是在别人手机上,我怎么知道,他(她)的手机支持呢?
有两种办法解决,这个问题。
(1)在AndroidManifest 下声明
你需要在清单列表(AndroidManifest.xml)声明,你需要使用OpenGL es和版本。
<uses-feature android:glEsVersion = “0x00020000” android:required = “true” />
glEsVersion = “0x00020000” : 指告诉系统这个应用程序需要OpenGL ES 2.0,0x00020000就是openGL的版本。
如果你需要OpenGL es 3.0 你只需要把 0x00020000改为0x00030000,依次类推。
提问:你有没有想过在AndroidManifest声明有什么用?
原因:
在Android中AndroidManifest是不会被反编译的,应用市场可以直接通过分析AndroidManifest来知道。
这个App需要什么权限,需要什么版本的系统支持。
这里是用来过滤不支持opneGL es 2.0的手机的,应用市场会对不支持的隐藏。(Google Play就是这样,别的不知道)
(2)在代码检查
在一些特点的开发中,我们需要它安装到设备上去,也需要知道我这个设备是否支持OpenGL es 2.0,则需要代码检查。
private boolean isOpenGL() {
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_OPENGLES_EXTENSION_PACK)) {
return false;
}
return true;
}具体怎么使用看开发场景了,大部分我们只需要在AndroidManifest简单声明一下。
因为基本99.8%的手机都支持了。点击可以查看Google的统计
(3)我需要使用3.0又怕不支持,怎么办?
还有一种情况,在不支持OpenGL es 3.0的时候使用OpenGL 2.0 。
其实谷歌也告诉我们怎么做了。
这里我就不讲直接指向Google的资料。如果访问不到,请自己百度,我就不费力讲这里了。
二、OpenGL es 2.0的基础知识
准备工作,做完了,我们还需要了解基础知识。
1.简单说明
举个例啊,在现实你要画画需要一张纸和一个笔才可以,在Android下也是这样。
GLSurfaceView 就是这张纸。当然你也可以使用TextureView、SurfaceView,但是这都是以后的事了。Renderer :就是笔。Renderer是渲染器负责进行OpenGL调用以渲染帧。
2.具体说明
(1)GLSurfaceView
GLSurfaceView:SurfaceView的一种实现,它使用专用表面来显示OpenGL渲染。你需要使用它邦定Activity的生命周期,防止发生错误。
(2)Renderer 渲染器
GLSurfaceView.Renderer在使用OpenGL ES的应用程序中实现类或渲染器是事情开始变得有趣的地方。此类控制GLSurfaceView与其关联的内容。
onSurfaceCreated()- 调用一次以设置视图的OpenGL ES环境。onSurfaceChanged()- 如果视图的几何图形发生更改,则调用此方法。(例如,设备的屏幕方向更改)onDrawFrame()- 为每次重绘视图调用。(我们大多操作在这个方法)
注意点:
onSurfaceCreated()这个方法不只是第一次创建才会被调用。当你返回主页面在进入是同样会调用,注意使用哦!
GLSurfaceView 会在一个单独的线程里调用Renderer渲染,如果需要通讯要转到主线程。
三、简单实战
接下我们要进入实战接待。当然很简单,就当是简单的了解吧!
我会把之前的步骤也演示出来,确保你得到的效果和我一致。
1. AndroidManifest.xml
对,声明需要OpenGL es 2.0 ,还是以2.0 为准。
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>2.MainAcitvity
我直接加载的是
GLSurfaceView,还有Shwo就是只是简单的工具类,在这只是个Toast。下面会有我的项目的Demo,它在GitHub上。
private MyGLSurfaceView mMyGLSurfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMyGLSurfaceView = new MyGLSurfaceView(this);
if (isOpenGL()) {
setContentView(mMyGLSurfaceView);
} else {
Show.showToast("没有找到OpenGL 2.0");
// 你也可以在这设置别的布局
setContentView(R.layout.activity_demo);
}
}
private boolean isOpenGL() {
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_OPENGLES_EXTENSION_PACK)) {
Show.showToast("该设备不支持OpenGL es 2.0");
return false;
}
return true;
}
@Override
protected void onPause() {
super.onPause();
mMyGLSurfaceView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mMyGLSurfaceView.onResume();
}
3. MyGLSurfaceView
private MyRenderer mMyRenderer;
public MyGLSurfaceView(Context context) {
super(context);
// 创建OpenGL版本
setEGLContextClientVersion(2);
// 创建自己的渲染器
mMyRenderer = new MyRenderer();
// 设置渲染器以在GLSurfaceView上绘图
setRenderer(mMyRenderer);
// 渲染器仅在创建曲面或requestRender()调用曲面时渲染。
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}setEGLContextClientVersion () 必须设置
setRenderMode() 通常设置两种参数,分别是RENDERMODE_WHEN_DIRTY、RENDERMODE_CONTINUOUSLY。
RENDERMODE_WHEN_DIRTY: 连续调用渲染器以重新渲染场景。
RENDERMODE_CONTINUOUSLY:渲染器仅在创建曲面或
requestRender()调用曲面时渲染。这里是为节约内存。
3.MyRenderer
这个类才是最关键的,基本操作在这里进行。
class MyRenderer implements GLSurfaceView.Renderer {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
Show.showLog("onSurfaceCreated");
// 设置清屏颜色
// 第一个参数红色、黄色、蓝色、透明度
GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
//onSurfaceChanged。surface大小改变的回调。比如横竖屏切换
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
Show.showLog("onSurfaceChanged");
// 设置在屏幕上的绘制窗口大小。
GLES20.glViewport(0, 0, width, height);
}
//onDrawFrame。每一次绘制帧的时候调用的方法。
@Override
public void onDrawFrame(GL10 gl) {
Show.showLog("onDrawFrame");
//清屏,每次调用就会执行
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
}
}
简单的功能,注释其实已经很清楚了,你现在不要急着想知道特别清楚。这里只是让你大概了解一下OpenGL es,效果就是在手机上显示给蓝色。这个例子很简单,我希望你能自己写出来,并在收手机上运行出来。
这章基本把一些特别基础的讲完了,希望你有所收获。这章的Demo对应的Demo目录的demo下面的代码,功能很简单,我就不贴gitHub的地址了,等下长在贴吧!
边栏推荐
- Pytorch学习记录(七):自定义模型 & Auto-Encoders
- torch分布式训练
- The future of the hybrid interface: conversational UI
- 【Unity】编辑器扩展-02-拓展Hierarchy视图
- 【RISC-V】risc-v架构学习笔记(架构初学)
- Small application project development, jingdong mall 】 【 uni - app custom search component (below) - search history
- SSM integration case study (detailed)
- (C语言基础)原样输入输出
- 【节选】吴恩达给出的AI职业生涯规划
- 刷题《剑指Offer》day07
猜你喜欢
![[Mini Program Project Development--Jingdong Mall] Custom Search Component of uni-app (Middle)--Search Suggestions](/img/ea/ee1ad50a497478b9d080bb5e4bdfb5.png)
[Mini Program Project Development--Jingdong Mall] Custom Search Component of uni-app (Middle)--Search Suggestions

期刊投递时的 Late News Submission 是什么

Binary tree search and backtracking problem (leetcode)

canvas粒子变幻各种形状js特效

期刊会议排名、信息检索网站推荐以及IEEE Latex模板下载

文件管理:目录管理

来n遍剑指--06. 从尾到头打印链表

【MySQL功法】第3话 · MySQL中常见的数据类型

如何升级nodejs版本

js部门预算和支出雷达图
随机推荐
qt pass custom structure parameters in different threads
7. JS ES6新增语法 new Map详讲,还有一道代码实战案例帮你快上手new Map
[What is the role of auto_increment in MySQL?】
文件管理:目录管理
Define event types in Splunk Web
第八章 、接口
js实现2020年元旦倒计时公告牌
Flink1.15源码阅读flink-clients——flink命令行帮助命令
Browser usage ratio js radar chart
js department budget and expenditure radar chart
傅里叶变换,拉普拉斯变换学习记录
作为面试官,关于线程池的问题我一般这样套路...
vue element form表单规则校验 点击提交后直接报数据库错误,没有显示错误信息
How to restore data using mysql binlog
JSP page对象简介说明
2019 NeurIPS | Graph Convolutional Policy Network for Goal-Directed Molecular Graph Generation
How on one machine (Windows) to install two MYSQL database
02 Truffle TutorialToken 示例
高并发高可用高性能的解决方案
[MySQL exercises] Chapter 2 Basic operations of databases and data tables