位置: 编程技术 - 正文

Android OpenGL ES向导学习笔记(扫盲专用)(opengl es2.0)

编辑:rootadmin
Android 目前支持下面几个版本的OpenGL ES API :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 )和更高的版本支持这个API规范。OpenGL ES 3.1 : Android 5.0(API )和更高的版本支持这个API规范。支持OpenGL ES 3.0的API需要实现设备生产厂家提供的图形管道,所以一个Android4.3或者更高版本的设备可能并不支持OpenGL ES 3.0.

推荐整理分享Android OpenGL ES向导学习笔记(扫盲专用)(opengl es2.0),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:安卓opengl es,opengl es2.0,opengl es应用开发实践指南:android卷,opengl es api,android opengles2.0教程,android opengles2.0教程,android opengl es教程,android opengl es教程,内容如对您有帮助,希望把文章链接给更多的朋友!

Android在framework API和NDK都提供了对OpenGL的支持

OpenGL ES包:

1、OpenGL ES 1.0/1.1 API 包 android.opengl -- 这个包提供了OpenGL ES 1.0/1.1包含类的静态接口,比javax.microedition.khronos 包里的接口有更好的性能GLESGLESExtGLESGLESExt javax.microedition.khronos.opengles -- 这个包里提供了OpenGL ES 1.0/1.1的标准实现GLGLExtGLGLExtGLExtensionPack2 . OpenGL ES 2.0的API类android.opengl.GLES -- 这个包提供了OpenGLES 2.0的接口,在Android2.2及以上版本可以使用。3. OpenGL ES 3.0/3/1的API包 android.opengl -- 这个包提供了OpenGL ES 3.0/3.1的类接口。GLESGLESGLESExt (Android Extension Pack)

为绘制对象映射坐标(Mapping Coordinates for Drawn Objects)

在Android设备上面展示图形的一个基本问题是屏幕的尺寸和形状都不同,OpenGL假设默认有一个统一的正方形坐标系,并将这些坐标绘制到通常不是正方形的屏幕上面,就像它是一个完美的正方形。图1 默认的OpenGL坐标系统(左) 映射到通常的Android设备屏幕(右) 上面的图片现实了OpenGL帧假设的统一坐标系统(左),和这些坐标是怎么映射到一个通常的设备横屏上的(右)。为了解决这个问题,你可以应用OpenGL投影模式和相机视图来变换坐标,使你的图形对象在任何屏幕上面都有正确的比例。 为了应用投影和相机视图,创建一个投影矩阵和相机视图矩阵,并将它们应用到OpenGL渲染管道,投影矩阵重新计算图形的坐标,使它们在设备屏幕上面正确映射。相机视图矩阵从一个特定的视图位置给渲染对象创建一个变换。OpenGL ES 1.0的投影和相机视图 在ES 1.0 API,通过为投影和相机视图创建相应的矩阵,然后把它们添加到OpenGL环境中。 1.投影矩阵 - 使用设备屏幕的几何参数创建投影矩阵,来重新计算对象的坐标,使它们以正确的比例绘制。下面的示例代码展示了在onSurfaceChanged()方法中以屏幕的宽高比创建投影矩阵,并把它应用到OpenGL渲染环境中去。public void onSurfaceChanged(GL gl, int width, int height) { gl.glViewport(0, 0, width, height); // make adjustments for screen ratio float ratio = (float) width / height; gl.glMatrixMode(GL.GL_PROJECTION); // set matrix to projection mode gl.glLoadIdentity();// reset the matrix to its default state gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // apply the projection matrix} 2.相机变换矩阵 - 当你使用投影矩阵适应了坐标系统后,你必须应用一个相机视图。下面的代码展示了使用GLU.gluLookAt()创建一个模拟相机位置的视图变换.public void onDrawFrame(GL gl) { ... // Set GL_MODELVIEW transformation mode gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity();// reset the matrix to its default state // When using GL_MODELVIEW, you must set the camera view GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f); ...}OpenGL ES 2.0或者更高版本的投影和相机视图

在ES 2.0或者3.0的API里面,应用投影和相机视图时,首先要向图形对象的顶点着色器添加一个矩阵成员对象,当矩阵对象添加后,就可以向对象生成和应用投影和相机视图矩阵。

Android OpenGL ES向导学习笔记(扫盲专用)(opengl es2.0)

1. 向顶点着色器中添加矩阵 - 为view的投影矩阵创建一个变量,然后将它与着色器的position相乘。下面的着色器代码,包含的uMVPMatrix成员允许你应用投影和相机视图矩阵到使用这个着色器的对象上面。private final String vertexShaderCode = // This matrix member variable provides a hook to manipulate // the coordinates of objects that use this vertex shader. "uniform mat4 uMVPMatrix; n" &#; "attribute vec4 vPosition; n" &#; "void main(){ n" &#; // The matrix must be included as part of gl_Position // Note that the uMVPMatrix factor *must be first* in order // for the matrix multiplication product to be correct. " gl_Position = uMVPMatrix * vPosition; n" &#; "} n";

注意:上面的示例在顶点着色器中定义了一个矩阵变换成员,你可以给这个矩阵应用一个投影和相机视图的结合矩阵。根据你的需求,可能会需要定义分开的投影矩阵和相机视图矩阵成员,以方便分开自由的改变它们。

2. 访问着色器矩阵 - 当你在顶点着色器中创建了hook之后,你可以访问这个变量来应用投影和相机视图矩阵。下面的代码显示了如何访问顶点着色器中定义的矩阵变量:public void onSurfaceCreated(GL unused, EGLConfig config) { ... muMVPMatrixHandle = GLES.glGetUniformLocation(mProgram, "uMVPMatrix"); ...}3. 创建投影和相机视图矩阵 - 生成可应用到图形对象的投影和视图矩阵。下面的代码根据设备屏幕的宽高比创建了投影矩阵和相机视图矩阵。public void onSurfaceCreated(GL unused, EGLConfig config) { ... // Create a camera view matrix Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);}public void onSurfaceChanged(GL unused, int width, int height) { GLES.glViewport(0, 0, width, height); float ratio = (float) width / height; // create a projection matrix from device screen geometry Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);}4. 应用投影和相机视图矩阵 - 应用投影和相机视图变换,将两个矩阵相乘,然后将它们设置到顶点着色器。下面的代码显示了如何将矩阵应用到openGL渲染的图形对象上public void onDrawFrame(GL unused) { ... // Combine the projection and camera view matrices Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); // Apply the combined projection and camera view transformations GLES.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); // Draw objects ...} OpenGL ES 1.0/1.1API与2.0或者更高的版本是明显不同的,1.x版本有更多方便的方法和固定的管线,而2.0和3.0API通过OpenGL着色器提供了更多对管线的直接控制。你应该仔细考虑绘制图形的需求,并且选择最适合应用的api。 OpenGL ES 3.0 API比2.0提供跟多的特性和更好的性能,同时也向下兼容。这意味着你可以将应用的OpenGL ES的版本设置为2.0,并选择性地包含一些有效的3.0图形特性。

纹理压缩支持

纹理压缩可以通过减少内存来显著地提高OpenGL的性能,使内存使用的效率更高。Android framework提供了ETC1压缩&#;式作为标准特性,包含了ETC1Util工具类和etctool压缩工具(位于Android SDK下的<sdk>/tools/目录)。 大部分的Android设备都支持ETC1&#;式,但是不保证它一定支持。检查设备是否支持ETC1&#;式,调用 ETC1Util.isETC1Supported()方法。ETC1纹理压缩&#;式不支持有透明度的纹理(alpha通道),如果应用需要有透明度的纹理,你应该选择目标设备支持的其他纹理压缩&#;式。 当使用OpenGL ES3.0时,ETC2/EAC纹理压缩&#;式是确保可用的,这种纹理&#;式有优秀的压缩比率,高质量的视觉效果,并且也支持透明度。 除了ETC&#;式,Android设备支持很多其他&#;式的纹理压缩,根据GPU芯片和OpenGL实现的不同略有差异。你应该调查目标设备所支持的压缩&#;式,然后再确定应用支持哪些压缩&#;式。为了确定设备支持哪些纹理&#;式,你必须查询设备,检查OpenGL的扩展名,它们标记了哪些纹理压缩&#;式可以被支持。一些常见的纹理压缩&#;式有以下几种:ATITC (ATC) - ATI纹理压缩在许多设备上面都支持,它支持RGB纹理压缩但不包含alpha通道,一些OpenGL扩展名可以代表这种&#;式,比如:GL_AMD_compressed_ATC_textureGL_ATI_texture_compression_atitcPVRTC-PVRTC纹理压缩在许多设备上面都支持,支持每个像素2位或者4位的纹理,包含或者不包含alpha通道都可以。下面的OpenGL扩展名可以代表这种&#;式,比如:GL_IMG_texture_compression_pvrtcS3TC (DXTn/DXTC)-S3有一些&#;式变化(从DXT1到DXT5),使用并不是很广泛。它支持包含4位或者8位alpha通道的RGB纹理。下面的OpenGL扩展名可以代表这种&#;式,比如:GL_OES_texture_compression_S3TCGL_EXT_texture_compression_s3tcGL_EXT_texture_compression_dxt1GL_EXT_texture_compression_dxt3GL_EXT_texture_compression_dxtDC - 3DC纹理压缩是比较少使用的支持包含alpha通道的RGB纹理,下面的OpenGL扩展名可以代表这种&#;式:GL_AMD_compressed_3DC_texture 这些纹理压缩&#;式并不是在所有的设备上面都支持,不同的制造商和设备支持的&#;式不同,一旦你决定应用哪种纹理压缩&#;式,一定要在manifest文件中使用 <supports-gl-texture> 进行声明,使用这个声明可以被Google Play过滤掉不支持这些&#;式的设备。

确定OpenGL扩展

OpenGL实现根据OpenGL ES API所支持的扩展而不同,这些扩展包含了纹理压缩,但通常还包括其他OpenGL功能集的扩展。

通过下面方法可以确定特定的一个设备上面支持哪些纹理压缩&#;式和OpenGL扩展:

1.在目标设备上面执行下面的代码来确定设备支持哪些纹理压缩&#;式,不同的机型上面结果不一样,所以你应该在多个机型上面运行这个代码,来确定哪些压缩&#;式是被广泛支持的:String extensions = javax.microedition.khronos.opengles.GL.glGetString(GL.GL_EXTENSIONS); 2.查看这个方法的输出,来确定设备支持哪些OpenGL扩展Android扩展包(AEP) AEP确保了应用支持标准化的OpenGL扩展集,它超出了OpenGL 3.1规范描述的核心集,将这些扩展打包促进了不同设备上面功能的一致,同时允许开发者充分利用手机GPU设备的最新功能。 AEP还提高了对图像、着色器存储缓存和片元着色器原子计数器的支持。 app使用AEP时,比如在manifest里进行声明,另外,平台版本必须支持它 <uses feature android:name="android.hardware.opengles.aep" android:required="true" /> 使用 hasSystemFeature(String)方法来验证是否支持AEP,传递FEATURE_OPENGLES_EXTENSION_PACK作为参数:boolean deviceSupportsAEP = getPackageManager().hasSystemFeature (PackageManager.FEATURE_OPENGLES_EXTENSION_PACK);

[置顶] 关于在vs中配置opengl红宝书第八版环境 本人刚开始学习opengl,买了一本opengl红宝书第八版,第一个例子研究了一段时间终于可以运行了,不知道有没有童鞋跟我遇到一样的问题。下面说说我

OpenGL--阴影 理论基础阴影:就是我们所说的影子,其实现原理其实就是把场景渲染了两次,第一次是把相机放到光源位置渲染场景,然后存储渲染的深度信息到一

向量的倒影 公式推导 这几天在处理3D倒影的时候,遇到了如何生成倒影的问题,经过一番查找,找到了一篇关于如何生成倒影的文章,讲解得比较详细,转载下来,供大家学

标签: opengl es2.0

本文链接地址:https://www.jiuchutong.com/biancheng/369583.html 转载请保留说明!

上一篇:OpenGL 学习笔记-2015.4.18——立方体纹理映射-天空盒子-环境映射(opengl learning)

下一篇:[置顶] 关于在vs2013中配置opengl红宝书第八版环境

  • 个人独资企业是否享受六税两费政策
  • 出口企业何时选择免(征)税申报方式?
  • 税收国家和地方的比例
  • 一次性发放年终奖怎么税务筹划
  • 以前年度损益调整结转到哪里
  • 生产型企业直接进口产品是否可直接出口
  • 医院工作服记什么科目
  • 人员处于银行代扣报盘期间什么意思
  • 报表申报错误怎么作废重报
  • 咨询服务合同印花税税目
  • 贷款利息未取得发票所得税税前扣除哪年开始
  • 当月少计提工资下月怎么处理?
  • 行政单位拨给下属单位经费会计分录
  • 外币账户收款如何做账务处理呢?
  • 预提利息属于费用吗
  • 年终对应交税费的减免税款怎样处理?
  • 提供劳务收取现金会计分录
  • 股东收取了公司的货款
  • 民办非企业收入会计分录
  • 企业零申报教学视频
  • 会务费发票税点是多少
  • 外贸出口企业城市排名
  • 增值税专用发票利润怎么交税
  • 票据单据较多,费用报销单一张不够填怎么办?
  • 没有库存先开票再发货
  • 典当行的账务处理会计分录大全
  • 个人社保费需要交多少年
  • 本年利润余额负数表示什么意思
  • 员工迟到扣工资的会计处理
  • 企业所得税纳税标准
  • 公司餐饮费怎么做账
  • 公司抵押贷款的担保人
  • 汽车消费税有发票吗
  • 如何加强企业应收应付款管理论文
  • php中类静态成员描述不正确的是
  • 实收资本(或股本)是什么意思
  • vue axios 拦截器
  • 发票开具使用要求
  • 织梦网站停止使用了还侵权吗
  • 交易性金融资产入账价值怎么计算
  • 医用增值税发票
  • 融资租赁公司的风险资产包括哪些
  • 技术服务合同的税率
  • 差旅费 包括
  • 发票红冲要去税务局吗
  • 进项税转出金额怎么算
  • 购入需安装设备的会计分录
  • 税金及附加和营业税金及附加是一个科目吗
  • 现金形式福利费个税软件怎么申报个税
  • 收到社保局的生育津贴并付给职工如何入账
  • 农业合作社账务都有什么科目
  • 收款单属于什么科目
  • 免税收入啥意思
  • 专项应付款贷方余额表示
  • 会计借方和贷方有哪些科目
  • mysql高级功能
  • win10预览版和正式版区别
  • freebsd ports安装
  • win7如何开启飞行模式
  • win10桌面右边没有了怎么弄出来了?
  • mac文件怎么用
  • nodejs edge
  • python接入微信
  • linux终端命令行和输出在一行
  • android layout布局
  • linux多线程编程实例
  • linux 中的atq命令
  • shell脚本判断命令是否执行成功
  • Jquery uploadify上传插件使用详解
  • Android Studio cvs 状态颜色
  • unity鼠标控制物体移动
  • python import os
  • javascriptcsdn
  • js使用类
  • 专用发票如何导出
  • 地方税务局怎么报税
  • 贵州省税务总局领导班子
  • 临时税务登记证是什么意思
  • 金税三期可以申报个税吗
  • 南京税务事务所排行
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设