A. android OpenGL 的基本使用
由于本人现在在公司做Android上的OpenGL图像处理相关功能,以前没有搞过这方面的知识,所以一切只能从头开始搞起,接下来将会慢慢分享其他方面的内容,先用这篇比较基础的文章来开头。
刚才我们谈到图像处理,在做图像处理我们不是可以用Canvas来绘制吗,怎么还要用OpenGL那么陌生的东西来搞?为什么要用OpenGL,肯定有它的好处。
接下来我们会来讲解如何在Android项目开发过程中加入OpenGL,在开始前我们先了解同OpenGL ES密切相关的载体:GLSurfaceView:
要用OpenGL绘制,首先要有GLSurfaceVie的实例
现在OpenGL ES版本已经到3.0了,Android平台上目前有1.0和2.0,我们使用的是2.0,在使用前在onCreate()方法中检查是否支持2.0的版本并且确定使用2.0
一般我们只需要使用“configurationInfo.reqGlEsVersion >= 0x20000”,至于加后面主要是用于模拟器检查,假定模拟器支持2.0。
前面说到GLSurfaceView挖了一个洞,就是为了看见下面的渲染表面,同样实在onCreate()方法中
通过setEGLContextClientVersion()方法配置surface视图,设定好使用的OpenGL版本,然后调用setRenderer()传进有自定义Renderer类的新实例。当Surface创建或者发生变化的时候,以及绘制一幅新帧时,渲染器都会被GLSurfaceView调用。
GLSurfaceView的生命周期要协同好Activity的生命周期,避免造成内存泄漏。
Renderer类也就是我们的渲染类了,它是通过实现Renderer接口来实现功能的。
渲染器接口定义的方法:
实现Renderer的接口方法
首选在onSurfaceCreated()中调用glClearColor设置清空屏幕用的颜色,这里使用红色。
设置视口的大小
在onDrawFrame()中调用glClear(GL_COLOR_BUFFER_BIT)清空屏幕,会调用glClearColor中定义的颜色来填充整个屏幕。通过这几个步骤,基本上就可以在GLSurfaceView绘制出东西了,在这里我只是简单的用红色绘制整个屏幕。
OpenGL在Android上的使用基本上是这样,但是,当然没那么简单,在使用OpenGL进行绘制算是比较繁琐的过程,后面也会慢慢去揭晓其他使用方法,来构造一幅一幅精美的特效静/动图。
B. Android核心技术与实例详解的前 言
Android是Google于2007年11月推出的一款开放的嵌入式操作系统平台,由于其完全开源的特性,Android正以空前的速度吸引着大批开发者的加入。为了帮助众多的软件开发人员尽快地掌握Android平台的相关知识,尽快地步入实际项目的开发中来,作者根据多年项目开发经验编写了此书。
本书既介绍了Android应用程序基本框架,也对Android平台的各种控件进行了讲解,还通过三个真实案例向读者介绍了Android应用程序完整的开发步骤。通过本书读者可以尽快地掌握在Android平台下进行开发的相关知识。
本书特点
1.内容饱满,由浅入深
本书内容既包括Android平台下开发的基础知识,也有项目编程的实用技巧,还提供了多个真实案例供读者学习。本书在知识的层次上由浅入深,使读者可以从Android的门外汉平稳、快速地步入Android开发的殿堂。
2.结构清晰、语言简洁
本书中所有案例都是按照笔者的实际开发过程进行介绍的,同时也是按照真实项目的开发流程进行的,结构清晰,语言简洁,便于实际练习。为了帮助读者更好地理解相关知识点,全书穿插了很多实用技巧及温馨提示。
3.实用超值的光盘
为了帮助读者更好地掌握与实践Android平台下应用程序的开发,本书附赠DVD光盘一张,其中包括案例的多媒体视频、电子教案(PPT)和实例源代码等。
4.实际商业案例
本书最后的三个案例都有实际商业价值,如果进行开发,价格要数万元,笔者将其完整地展现给了读者。
本书内容导读
本书共分三篇,第一篇介绍了在Android平台下进行应用程序开发的基本知识,主要对Android应用程序框架及用户界面的开发进行了介绍。章 名 主 要 内 容
第1章 Android开发起步 简要说明Android平台的来历及其特性,同时介绍了在Android平台下开发用户界面的基本知识
第2章 Android应用程序的构成 对Android平台下的应用程序构成进行了介绍,同时还介绍了应用程序基本组件(如Activity等)的相关知识
第3章 Android布局管理器 初步介绍Android平台下用户界面的开发,主要对布局管理器(如线性布局等的用法)进行了介绍
第4章 Android常用基本控件 介绍了Android平台用户界面中基本控件(如按钮和文本框等)的特性及其用法
第5章 Android常用高级控件 继续上一章的内容,对Android平台用户界面中的高级控件的相关知识和用法进行了介绍
第6章 菜单与对话框 介绍了Android平台选项菜单、上下文菜单和子菜单等的相关知识,同时还将各种对话框的用法进行了详细的介绍
第7章 Android事件处理模型 对Android平台下用户界面开发中常用到的事件处理模型进行了介绍
第二篇介绍如何在Android平台下进行高级应用程序的开发,包括游戏和基于OpenGL ES的3D应用程序的开发,以及与针对手机特性和网络服务程序的开发。
章 名 主 要 内 容
第8章 游戏与3D应用程序开发 向读者介绍了在Android平台下进行游戏开发的相关知识,同时还对Android平台下3D应用程序的开发进行了初步介绍
第9章 消息广播与服务 对Android平台下基于Intent的消息广播机制进行了介绍,同时通过一个比较大的案例说明Service组件的用法
第10章 网络与数据处理 简要介绍了在Android平台下进行网络编程的相关知识,同时还对Android平台下的SQLite等数据处理机制进行了介绍
第11章 手机通信功能开发 通过实例对Android平台下基于手机通信功能(如打电话、发短信和E-mail)的开发进行了介绍
第12章 手机特有Feature开发 介绍了如何基于Android平台对手机的特性进行开发,如改变壁纸、控制手机振动和音量等
第13章 桌面组件与多媒体数据采集 简单介绍了如何在Android平台下开发包括快捷方式和实时文件夹等在内的桌面组件的流程,以及如何在程序中对多媒体数据(如音频和图像)等进行采集的步骤
第14章 传感器应用的开发 对Android平台下传感器的相关知识进行了简单介绍,并通过案例来讲解开发基于传感器的应用程序的步骤
第15章 Google服务 介绍了在应用程序中与Google提供的如Google Map等网络服务进行混搭的开发步骤
第三篇以三个比较大的案例来说明Android平台下大型应用的开发流程,通过这三个案例的讲解,读者对Android开发将会有更深层次的理解。
章 名 主 要 内 容
第16章 Android游戏开发实践——快乐数独 介绍了手机游戏《快乐数独》的开发,通过该案例向读者介绍了在Android平台下进行游戏开发的相关知识和基本流程,并对游戏开发中的编程技巧进行了介绍
第17章 Android地图搜索应用——美食天下 介绍了地图搜索应用《美食天下》的开发,该应用包括Web端和Android手机端,通过该案例向读者介绍了在Android平台下开发大型应用的基本步骤
第18章 Android社交分享平台——口袋微博 介绍了社交分享平台《口袋微博》的开发,该平台包括Web端和Android手机端,通过该案例向读者介绍了基于客户端/服务器模式的网络应用程序开发的基本步骤
本书面向的读者
本书的内容十分详细,几乎涵盖了Android相关的所有技术,并向读者介绍了真实项目的开发流程,主要面向以下读者。
Android初学者:本书详细介绍了Android的基础知识及各种控件,并对Android平台下3D程序的开发进行了介绍,Android初学者通过本书可以快速、全面地掌握Android平台相关知识,快速地步入Android开发人员的行列。
有一定java基础且希望学习Android开发的读者:Android平台下的开发基于Java语言,有一定Java基础的读者通过阅读本书的前半部分便可快速地掌握Android的各种组件及基础控件,然后通过三个真实案例的学习迅速地掌握Android平台下的应用程序开发。
在职的开发人员:本书中的案例都是作者精心挑选的,其中涉及的相关知识均是作者多年来积累的编程经验及心得体会。具有一定开发经验的在职开发人员可以通过本书进一步巩固Android的基础知识,并迅速成为高级的Android开发人员。
本书作者
吴亚峰,毕业于北京邮电大学,后留学澳大利亚卧龙岗大学取得硕士学位。1998年开始从事Java的开发,有十多年的Java开发与培训经验。主要的研究方向为手机游戏、Java EE、搜索引擎,现为手机游戏、Java EE独立软件开发工程师,同时兼任Sun授权Java培训中心认证教师。为数十家着名企业培训了上千名软件开发人员,曾编写过《Java SE 6.0编程指南》、《30天学通Java Web项目案例开发》、《Java程序员职场全攻略:从小工到专家》、《Android 2.0游戏开发实战宝典》等畅销技术书籍。2008年开始关注Android平台下的应用开发,并开发出一系列优秀的Android应用程序。
索依娜,毕业于燕山大学,从业于计算机软件领域9年,在软件开发和计算机教学方面有着丰富的经验。工作期间曾参与省级科研项目2项、市级科研项目1项、发表论文多篇;同时为多个厂矿,企事业单位设计、开发了信息管理系统;从2008年开始关注Android平台下应用的开发,参与开发了多款手机娱乐应用。
另外,昊燃、方振宇、陈冠佐、傅奎、陈勤、梁洋洋、毕梦飞、陈庆、柴相花、陈非凡、陈华、陈嵩、承卓也参与了本书的编写。在此表示感谢!
本书在编写过程中得到了唐山百纳科技有限公司Java培训中心的大力支持,同时 于庭龙、魏鹏飞、王海峰及作者的家人为本书的编写提供了很多帮助,在此表示衷心感谢!
由于编者的水平和学识有限,且书中涉及的知识较多,难免有疏漏之处,敬请广大读者朋友批评指正。
编者
C. android opengles2.0值得学习吗
OpenGLES是一个让人崩溃的东西。在Andorid手机上做3D还就得用它。把我记的一些笔记分享在这里吧:
Android OpenGL ES简介 20011-6-3
Android系统使用OpenGL的标准接口来支持3D图形功能,android 3D图形系统也分为java框架和本地代码两部分。
本地代码主要实现的OpenGL接口的库,在Java框架层,javax.microedition.khronos.opengles是java标准的OpenGL包,
android.opengl包提供了OpenGL系统和Android GUI系统之间的联系。
Android的本地代码位于frameworks/base/opengl下,
JNI代码位于frameworks/base/core/com_google_android_gles_jni_GLImpl.cpp和frameworks/base/core/com_google_android_gles_jni_EGLImpl.cpp,
java类位于opengl/java/javax/microedition/khronos下
本地测试代码位于frameworks/base/opengl/tests。包括angeles、fillrate等14个测试代码,这些代码都可以通过终端进行本地调用测试(模拟器中使用adb shell)。
OpenGL ES 1.x
固定管线操作,支持glVertexPointer()等函数,不支持GLSL。头文件在ndk的GLES目录下,库文件是libGLESv1_CM.so。
OpenGL ES 2.x
可编程管线操作,不兼容1.x,不支持固定管线操作,例如glVertexPointer()等函数。支持GLSL(还必须用这个来编程)。头文件在ndk的GLES2目录下,库文件是libGLESv2.so。
OpenGL ES学习 2011-6-30
OpenGL定义了自己的数据类型。应该坚持使用这些OpenGL的数据类型,从而保证可移植性和效率。
OpenGL ES 目前不支持64位数据类型。
OpenGL ES 只支持三边形。
OpenGL ES 只支持gl开头的函数,glu库都不支持。
OpenGL ES 从 OpenGL中删除的功能:
1. glBegin/glEnd
2. glArrayElement
3. 显示列表
4. 求值器
5. 索引色模式
6. 自定义裁剪平面
7. glRect
8. 图像处理(这个一般显卡也没有,FireGL/Quadro显卡有)
9. 反馈缓冲
10. 选择缓冲
11. 累积缓冲
12. 边界标志
13. glPolygonMode
14. GL_QUADS,GL_QUAD_STRIP,GL_POLYGON
15. glPushAttrib,glPopAttrib,glPushClientAttrib,glPopClientAttrib
16. TEXTURE_1D、TEXTURE_3D、TEXTURE_RECT、TEXTURE_CUBE_MAP
17. GL_COMBINE
18. 自动纹理坐标生成
19. 纹理边界
20. GL_CLAMP、GL_CLAMP_TO_BORDER
21. 消失纹理代表
22. 纹理LOD限定
23. 纹理偏好限定
24. 纹理自动压缩、解压缩
25. glDrawPixels,glPixelTransfer,glPixelZoom
26. glReadBuffer,glDrawBuffer,glCopyPixels
OpenGL ES 2.0 2011-10-9
2.0和1.1不兼容。
- 2.0使用的头文件是ndk的include目录下的GLES2目录,有gl2.h,gl2ext.h,gl2platform.h,而1.1使用的是GLES目录。
- 2.0使用的库文件是ndk的lib目录下的libGLESv2.so,而1.1使用的是libGLESv1_CM.so。
- 2.0中取消了很多1.1函数,例如glMatrixModel和glLoadIdentity等。
OpenGL着色语言(GLSL――OpenGL Shading Language)
- 使用2.0,必须学此语言。因为很多1.1的函数都被取消了。
san-angeles NDK OpenGL ES 1.1的例子程序 2012-3-8
San Angeles,查维基网络,是一个虚构的未来概念城市,位于南加州。常在电影中出现,来源自Los Angeles和San Diego.
该程序的演示效果是,观察一个宏伟的城市,地面是镜面有建筑倒影,城市中有飞船飞过。前后有5、6个观察点,而且镜头在每个观察点不停的移动。
这个例子,用NDK(C++)调用OpenGL ES 1.1来绘制了San Angeles这个城市。基本上全部使用了NDK,Java程序只有1个。
用vc2005演示一下,目的通过跟踪代码了解一些细节。方法是:
- 将jni下所有的.h文件,以及demo.c,app-win32.c复制出来,放在一个专门的目录下,然后改造成用OpenGL的而不是ES的。(或者干脆删除大段的绘制代码,保证编译通过)
首先分析Java代码
- DemoActivity.java,这是唯一的Java文件,它主要需要下列4个jni的接口:
- private static native void nativeInit(); // 初始化
- private static native void nativeResize(int w, int h);
- private static native void nativeRender(); // 绘制1帧
- private static native void nativeDone();
其次分析C++代码 app-android.c
- 首先,调用了importGLInit(),动态导入OpenGL的库。
- 其次,调用了 appInit(),在内存中建立了平台无关的3D对象集合。建立方法是用一个数组,用类似画圆拔高的方式产生诸多三角形。
- 然后,在每个时钟周期中调用appRender(),细节是:
- prepareFrame(width, height); // 准备OpenGL ES绘制框架。其实就是清空颜色和深度缓冲,重置投影和模型矩阵。
- camTrack(); // 算好在当前时钟周期,镜头的位置、朝向及焦距等。然后调用gluLookAt来实现。
- configureLightAndMaterial(); // 设置光源和材质
- drawModels(-1); // 先绘制倒影(其实就是将所有模型z轴倒过来画)
- 第一个循环,是画精致的物体
- 第二个循环,是画运动的物体
- drawGroundPlane(); // 再绘制镜子一般的地面。在绘制前取消光照,打开混合,然后绘制。绘制后还原状态。
- drawModels(1); // 再绘制所有模型
- drawFadeQuad(); // 最后绘制淡出框,用融合的方式画一个遮住整个视口的2D框,融合系数和时间相关。
D. 有哪些关于游戏开发最初入门级的书籍介绍介绍
你可以先去【绘学霸】网站找“游戏特效/unity3D”板块的【免费】视频教程-【点击进入】完整入门到精通视频教程列表: www.huixueba.net/web/AppWebClient/AllCourseAndResourcePage?type=1&tagid=305,306&zdhhr-11y17r-102912452
想要系统的学习可以考虑报一个网络直播课,推荐CGWANG的网络课。老师讲得细,上完还可以回看,还有同类型录播课可以免费学(赠送终身VIP)。
自制能力相对较弱的话,建议还是去好点的培训机构,实力和规模在国内排名前几的大机构,推荐行业龙头:王氏教育。
王氏教育全国直营校区面授课程试听【复制后面链接在浏览器也可打开】:
www.cgwang.com/course/gecoursemobilecheck/?zdhhr-11y17r-102912452
在“游戏特效/unity3D”领域的培训机构里,【王氏教育】是国内的老大,且没有加盟分校,都是总部直营的连锁校区。跟很多其它同类型大机构不一样的是:王氏教育每个校区都是实体面授,老师是手把手教,而且有专门的班主任从早盯到晚,爆肝式的学习模式,提升会很快,特别适合基础差的学生。
大家可以先把【绘学霸】APP下载到自己手机,方便碎片时间学习——绘学霸APP下载: www.huixueba.com.cn/Scripts/download.html
E. 求 OpenGl ES 教程,本人毕设要做一个3D的平衡球游戏(android平台), 由于以前没有接触过 OpenGL
有一本书叫做android3D游戏开发就是讲OpenGL的你说的平衡球里面就有例子!
http://proct.dangdang.com/proct.aspx?proct_id=21104412
你可以看看!里面讲的非常详细。
希望可以帮到你。
F. Android OpenGL ES(四)-为平面图添加滤镜
上一章加载图片的过程,在这里就不做赘述。
之前我们通过YUV数据格式的处理知道,只要保留Y的数据,就是灰度的图片。但是OpenGL中处理的是RGB格式的数据,我们要如何去取得灰度图呢?
我们可以通过公式,计算出新的RGB值,就是灰度的图片了。
我们的目标已经确定。下面我们需要将片段着色器上的每个像素的RGB值,通过上面的公式计算,装换成我们的灰度值。
根据上面的思路,我们需要去改片元着色器。 texture_fragment_shader.glsl
对比之前的,需要是有如下的修改点:
按照之前的想法,我们需要将我们的公式中的系数传递进入,就可以完成我们的操作了。基于之前的认识,我们知道传递我们的属性 uniform 给OpenGL的都是通过创建数组,绑定属性,这一套流程。
与上面的黑白色的处理相似,冷色调的处理就是单一增加蓝色通道的值,暖色调的处理可以增加红绿通道的值。
不管是冷色还是暖色。每个像素的颜色都和我们传入的色值相加,产生偏置之后的颜色。同时还要确保颜色的值合法。如果超过最大,或者小于最小,就用极限值表示。
还是之前的套路。
红黄通道增加的结果
蓝色通道增加的结果
图片模糊处理相对上面的色调处理稍微复杂一点,通常图片模糊处理是采集周边多个点,
然后利用这些点的色彩和这个点自身的色彩进行计算,得到一个新的色彩值作为目标色彩。
模糊处理有很多算法,类似高斯模糊、径向模糊等等。
最常用的还是高斯模糊。先看一下高斯模糊的原理。
使用正态分布作为权重分配模式,对周围像素取平均值的方式,就是高斯模糊。
在图形上,正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。
计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。
上面的正态分布是一维的,图像都是二维的,所以我们需要二维的正态分布。
二维高斯函数:
有了这个函数 ,就可以计算每个点的权重了。
为了计算权重矩阵,需要设定σ的值。假定σ=1.5,则 模糊半径为1 的权重矩阵,权重之和等于1,得到最终的权重矩阵。
对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。
如果一个点处于边界,周边没有足够的点,怎么耐兄袭办?
一个变通方法,就是昌兄把已有的点拷贝到另一面的对应位置尘禅,模拟出完整的矩阵。
上面着色器。我们是计算好了卷积核,直接在 shader 内写死应用的。
这一小节的内容耗时比较长。其实就是利用OpenGL的shader对图像进行简单的滤镜处理。
从这节我们学习到
下一章,会回到Android的内容。将OpenGl和Camera结合在一起。通过OpenGl来显示一个预览的画面。
G. OpenGl ES 2.0 Learn For Android(五)碰撞检测
在现实生活里,碰撞是怎样发生的呢?是两个实体的边缘相接触。在OpenGL的视图世界里,肯定也是这个样子。但是我们不可能把一个物体的所有点都描述出来,然后在另一个集合里看是否有点的存在。
那么最简单的方式,就是将一个实体看做一个球,它的假设它的外边缘都在半径里。那么这个问题就简化成了,这个半径范围内,是否会有其他物体存在。
那我们在OpenGL世界坐标系里放置半径R1一个物体。如果是世界坐标系里放半径R2另一物体,那么,只要两个物体的中心位置距离dis小于两个物体半径和(R1+R2),就可以认为它们相交。这个是很容易理解的。
《OpenGL ES应用开发实践指南:Android卷》则用手指触点检测相交。其实这个问题并没有发生变化。我们还是在世界坐标系里看相交就好了。投射到屏幕的一个点,同样可以转换为世界坐标系里的两个点。这里涉及一些奇怪的技巧。比如,将一个不知道Z轴位置的点设置为-1/1。
这边我会做一个更简易的版本。我在世界坐标系里放置一个边长为1的正方体。如下图所示。
在之前讲到三角形的画法的时候,有讲到三角带。这是openGL为了节省节点,设计的绘制方案。这里的话,顶点也按对应的方式进行排布。
为了方便,我并没有绘制它的上下两个面。
将上一篇的顶点下面方式赋值。颜色也对应改改。
在上一篇的时候,我只用了modelMatrix和projectionMatrix。因为上一篇使用的默认视角,也就是从Z轴往它的负方向看去。
其实这一篇方向还是不会发生变化,但是这里需要用到视角的概念,也就是 setLookAtM() 这个方法。
所以引入这三个矩阵
viewMatrix 用来保存相机矩阵。 viewProjectionMatrix 用来保存透视投影和相机矩阵的乘积。 invertedViewProjectionMatrix 用来保存 viewProjectionMatrix 的逆矩阵。
因为要拿到触碰事件,给GlSurfaceView.setOnTouchListener
有意思的来了。我们知道,Android View的坐标系是左上角为原点,往右是x正方向,往下是y正方向。但是OpenGL ES归一化坐标里,坐标原点在屏幕正中央,往右是x正方向,往上是y正方向。 以X轴为例,要做是的从[0,1]映射到[-1,1]。那么x*2-1就可以达到想要的效果。这个如果后面有时间介绍构型函数,会见得很多。
我们拿到了触点的归一化坐标,我们要转换成世界坐标,这样才能做距离计算。
计算距离的工具类直接从示例中拿出来
这里光使用计算距离的方法,可以看书的9.2章。我觉得我肯定是没作者讲得好了。
使用上一篇用的投影参数,矩阵显得有些大了,所以在使用前,先把他们都缩小到1/5大小。
这里的话我要偷些懒,把 handleTouchPress 直接用上工具类里的方法。
在将点击的坐标转换为世界坐标里线段的方法里,有用到 invertedViewProjectionMatrix
它是 viewProjectionMatrix 的逆矩阵
那我做的判断是,如果点击了正方体,则停止旋转。效果如下
demo地址:
https://github.com/YueZhiFengMing/LearnOpenGl/tree/master/Fourth3D