Android OpenGLES2.0(一)OpenGLES2.0基础介绍

文章目录

  • 什么是OpenGL ES?
  • OpenGL ES可以做什么?
  • OpenGL ES版本及Android支持情况
  • OpenGL ES 2.0的优点
  • OpenGL ES 2.0中基本概念
    • 顶点着色器
    • 片元着色器
    • 着色器语言
    • 坐标系
    • 图形的绘制
    • 投影
    • 光照
    • 纹理映射
    • 其它
  • OpenGL ES 2.0过程及理解

什么是OpenGL ES?

OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。

OpenGL在不同的平台上有不同的实现,但是它定义好了专业的程序接口,不同的平台都是遵照该接口来进行实现的,思想完全相同,方法名也是一致的,所以使用时也基本一致,只需要根据不同的语言环境稍有不同而已。OpenGL这套3D图形API从1992年发布的1.0版本到目前最新2014年发布的4.5版本,在众多平台上多有着广泛的使用。

OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。

OpenGL ES相对于OpenGL来说,减少了许多不是必须的方法和数据类型,去掉了不必须的功能,对代价大的功能做了限制,比OpenGL更为轻量。在OpenGL ES的世界里,没有四边形、多边形,无论多复杂的图形都是由点、线和三角形组成的,也去除了glBegin/glEnd等方法。

OpenGL ES可以做什么?

OpenGL ES是手机、PDA和游戏主机等嵌入式设备三维(二维也包括)图形处理的API,当然是用来在嵌入式设备上的图形处理了,OpenGL ES 强大的渲染能力使其成为我们在嵌入式设备上进行图形处理的优良选择。我们经常使用的场景有:

  • 图片处理。比如图片色调转换、美颜等。
  • 摄像头预览效果处理。比如美颜相机、恶搞相机等。
  • 视频处理。摄像头预览效果处理可以,这个自然也不在话下了。
  • 3D游戏。比如神庙逃亡、都市赛车等。

OpenGL ES版本及Android支持情况

OpenGL ES当前主要版本有1.0/1.1/2.0/3.0/3.1。这些版本的主要情况如下:

  • OpenGL ES1.0是基于OpenGL 1.3的,OpenGL ES1.1是基于OpenGL 1.5的。Android1.0和更高的版本支持这个API规范。OpenGL ES 1.x是针对固定硬件管线的。
  • OpenGL ES2.0是基于OpenGL 2.0的,不兼容OpenGL ES 1.x。Android 2.2(API 8)和更高的版本支持这个API规范。OpenGL ES 2.x是针对可编程硬件管线的。
  • OpenGL ES3.0的技术特性几乎完全来自OpenGL 3.x的,向下兼容OpenGL ES 2.x。Android 4.3(API 18)及更高的版本支持这个API规范。
  • OpenGL ES3.1基本上可以属于OpenGL 4.x的子集,向下兼容OpenGL ES3.0/2.0。Android 5.0(API 21)和更高的版本支持这个API规范。

OpenGL ES 2.0的优点

由于OpenGL ES 3.x都向下兼容OpenGL ES 2.0,加上当前Android手机主流虽然是4.4+,但是依旧不乏存在Android2.3、Android4.0的“老爷机”。所以学习OpenGL ES选择2.0版本是一个相对最佳的选择。当然,虽然OpenGL ES 2.0并不兼容OpenGL ES 1.x,但是它们在使用上有着很多共通之处。
相对OpenGL ES 1.x,OpenGL ES 2.0进行了大变革,更具灵活性,功能也更强大,并且渲染效率更高,效果更好。当然,灵活性可能会让你觉得使用起来比OpenGL ES 1.x复杂许多。
OpenGL ES 2.0中的“顶点着色器”取代了OpenGL ES 1.x中的“变换和光照阶段”,“片元着色器”取代了“纹理颜色和环境求和”、“雾”、“Alpha测试”等阶段。使得原来又OpenGL ES 1.x固定的阶段需要用户自己开发着色器处理,虽然在一定的程度上增加了代码复杂度,但是灵活性却大大增加,同时也能够处理OpenGL ES 1.x中难以完成的处理任务。
下图是OpenGL ES 1.x的固定渲染管线及OpenGL ES 2.0的可编程渲染管线图:
在这里插入图片描述

OpenGL ES 2.0中基本概念

学习OpenGL ES 2.0需要知道OpenGL ES 2.0相关的一些概念及知识。
在上段中提到了OpenGL ES 2.0相对1.x全新的两个重要东西——顶点着色器和片元着色器。

顶点着色器

着色器(Shader)是在GPU上运行的小程序。从名称可以看出,可通过处理它们来处理顶点。此程序使用OpenGL ES SL语言来编写。它是一个描述顶点或像素特性的简单程序。

对于发送给GPU的每一个顶点,都要执行一次顶点着色器。其功能是把每个顶点在虚拟空间中的三维坐标变换为可以在屏幕上显示的二维坐标,并带有用于z-buffer的深度信息。顶点着色器可以操作的属性有:位置、颜色、纹理坐标,但是不能创建新的顶点。
顶点着色器的输入输出模型如下:
在这里插入图片描述

片元着色器

片元着色器计算每个像素的颜色和其它属性。它通过应用光照值、凹凸贴图,阴影,镜面高光,半透明等处理来计算像素的颜色并输出。它也可改变像素的深度(z-buffering)或在多个渲染目标被激活的状态下输出多种颜色。一个片元着色器不能产生复杂的效果,因为它只在一个像素上进行操作,而不知道场景的几何形状。
片元着色器的输入输出模型如下:
在这里插入图片描述

着色器语言

着色器语言(Shading Language)是一种高级的图形编程语言,仅适合于GPU编程,其源自应用广泛的C语言。对于顶点着色器和片元着色器的开发都需要用到着色器语言进行开发。它是面向过程的而非面向对象。
关于着色器语言中的变量、语法在以后使用过程中会提及。想要系统的学习着色器语言,请查阅其他相关博文和书籍。

坐标系

OpenGL ES采用的是右手坐标,选取屏幕中心为原点,从原点到屏幕边缘默认长度为1,也就是说默认情况下,从原点到(1,0,0)的距离和到(0,1,0)的距离在屏幕上展示的并不相同。即向右为X正轴方向,向左为X负轴方向,向上为Y轴正轴方向,向下为Y轴负轴方向,屏幕面垂直向上为Z轴正轴方向,垂直向下为Z轴负轴方向。

图形的绘制

前面提到OpenGL ES2.0的世界里面只有点、线、三角形,其它更为复杂的几何形状都是由三角形构成的。包括正方形、圆形、正方体、球体等。但是其他更为复杂的物体,我们不可能都自己去用三角形构建,这个时候就需要通过加载利用其他软件(比如3DMax)构建的3D模型。

投影

OpenGL ES 的世界是3D的,但是手机屏幕能够给我展示的终究是一个平面,只不过是在绘制的过程中利用色彩和线条让画面呈现出3D的效果。OpenGL ES将这种从3D到2D的转换过程利用投影的方式使计算相对使用者来说变得简单可设置。
OpenGL ES中有两种投影方式:正交投影和透视投影。正交投影,物体不会随距离观测点的位置而大小发生变化。而透视投影,距离观测点越远,物体越小,距离观测点越近,物体越大。

光照

如果利用直接给出颜色的方式来对3D场景中的物体进行着色渲染,很难使3D场景拥有较强的真实感。一般来说,曲面物体比平面物体更能体现出光照效果。想用数学模型完全模拟真实世界的光照情况是很难的,而OpenGL ES 2.0采用的光照模型相对真实世界的光照是进行了很大的简化。在OpenGL ES 2.0中,光照由三种元素组成(也可以说是三种通道组成),分别为环境光、镜面光及散射光。

  • 环境光是指从四面八方照射到物体上,其具体公式为:
    环境光照射结果=材质反射系数∗环境光强度环境光照射结果=材质反射系数∗环境光强度=
  • 散射光是指现实世界中组草的物体表面被光照射时,反射光在各个方向基本均匀的情况,其具体公式为:
    散射光照射结果=材质的反射系数∗散射光强度∗max(cos(入射角),0)散射光照射结果=材质的反射系数∗散射光强度∗max(cos(入射角),0)=max(cos()0)
    实际开发中往往分两步计算:
    散射光最终强度=散射光强度∗max(cos(入射角),0)散射光最终强度=散射光强度∗max(cos(入射角),0) =max(cos()0)
    散射光照射结果=材质的反射系数∗散射光最终强度散射光照射结果=材质的反射系数∗散射光最终强度 =
  • 镜面光是指现实世界中光滑的表面被照射时会有方向很集中的反射光,与散射光最终强度依赖于入射光与被照射点的法向量夹角不同,镜面光的强度还依赖于观察者的位置,具体公式如下:
    镜面光照射结果=材质的反射系数∗镜面光强度∗max(0,cos(半向量与法向量的夹角)粗糙度)镜面光照射结果=材质的反射系数∗镜面光强度∗max(0,cos(半向量与法向量的夹角)^{粗糙度})=max(0,cos())
    实际开发中也是往往分两步计算:

镜面光最终强度=镜面光强度∗max⁡(0,cos⁡(半向量与法向量的夹角)粗糙度)镜面光最终强度=镜面光强度∗\max(0,\cos(半向量与法向量的夹角)^{粗糙度}) =max(0,cos())
镜面光照射结果=材质的反射系数∗镜面光最终强度镜面光照射结果=材质的反射系数∗镜面光最终强度=

纹理映射

现实世界中的物体往往是绚丽多彩的,要模拟现实世界的绚丽多彩,绘制出更加真实、酷炫的3D物体,就需要用到纹理映射了。纹理映射是将2D的纹理映射到3D场景中的立体物体上。

其它

其它更多的诸如3D模型加载、贴图、阴影、粒子、混合与雾、标志板、天空盒和与天空穹等知识后续学习使用时再详细介绍。

OpenGL ES 2.0过程及理解

从OpenGL ES 2.0的渲染管线图中,可以看到OpenGL ES 2.0渲染过程为:
读取顶点数据——执行顶点着色器——组装图元——光栅化图元——执行片元着色器——写入帧缓冲区——显示到屏幕上。

OpenGL作为本地库直接运行在硬件上,没有虚拟机,也没有垃圾回收或者内存压缩。在Java层定义图像的数据需要能被OpenGL存取,因此,需要把内存从Java堆复制到本地堆。
顶点着色器是针对每个顶点都会执行的程序,是确定每个顶点的位置。同理,片元着色器是针对每个片元都会执行的程序,确定每个片元的颜色。
着色器需要进行编译,然后链接到OpenGL程序中。一个OpenGL的程序就是把一个顶点着色器和一个片段着色器链接在一起变成单个对象。

转自湖广午王https://wuwang.blog.csdn.net/article/details/52793354

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows ‘ls‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

文章目录前言原因解决办法前言 Windows和mac混用或Windows与linux混用的情况下,在windows dos窗口随手一个ls,出现了 ‘ls’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 原因 ls是linux的命令,不是windows的命令,win…

Linux ls 命令使用介绍

文章目录命令格式命令功能常用参数常用示例示例1 列出文件夹下的所有文件和目录的详细资料示例2 列出当前目录中所有以“t”开头的目录的详细内容,示例3 只列出文件下的子目录命令:示例4 列出目前工作目录下所有名称是以s开头的档案,越新的排…

字符串去重_文件数据去重示例

【摘要】本文介绍小文件与大文件在进行数据去重时的几种处理办法,比如按整行或关键列去除重复数据或留下重复数据,并用 esProc SPL 举例实现。请点击文件数据去重示例了解详情在数据处理业务中,有时需要清除文件中的重复数据或只留下重复数据…

arm ubuntu 编译boost_使用yocto工具编译qt5.9.6总结

运行平台:OKMX6DL-C编译平台:Ubuntu 14.04.6 LTS编译工具:arm-poky-linux-gnueabi-gcc(gcc version 5.3.0 (GCC) )qt源码:qt-everywhere-opensource-src-5.9.6.tar.xz参考:嵌入式开发之Qt-5.9.6…

Linux crond命令使用介绍

目录前言一、crond简介系统任务调度用户任务调度二、crond服务三、crontab命令详解1.命令格式2.命令功能3.命令参数4.常用方法1). 创建一个新的crontab文件2). 列出crontab文件3). 编辑crontab文件4). 删除crontab文件5). 恢复丢失…

Android App屏幕旋转要点

文章目录前言屏幕旋转“预热”android:screenOrientationandroid:configChangesAcitvity onConfigurationChanged(newConfig: Configuration?)代码控制方向跟随系统重力感应总结前言 关于app横竖全屏切换,大多数属于音视频播放类app,电子书、文档类的应…

HTML静态页面获取url参数和UserAgent

目录前言原因解决1、静态页面获取url的参数2、取useragent的值3、测试页面前言 接技术支持小伙伴信:有用户反馈app在华为设备上下载不了,以为是服务器覆盖的范围不够或服务器挂了,直到另一个客服同事发来一个录屏,基本知道原因&a…

Android手机或平板设置浏览器的UserAgent

目录前言修改UserAgent实操华为手机自带浏览器Chrome(谷歌浏览器)QQ浏览器UC浏览器360浏览器前言 移动互联网盛行的当下,网页在电脑端和移动设备(包括手机,平板以及一些基于Android系统定制的设备)的适配主…

android jni fork()子进程不运行_Android高级面试谈谈Zygote的理解

Zygoto的作用Zygoto的作用有两个:1. 启动SystemServer2. 孵化应用进程SystemServer也是通过Zygoto来启动的,因为SystemServer需要Zygoto初始化好的一些系统资源,包括常用的类、JNI函数、共享库等等,这些资源直接从Zygoto继承过来对…

送给女朋友的情话

风拂鹊桥霓裳起 与卿漫话风雨里 初识 那一年端午 带着无比喜悦与期待 搭上去福州的火车 那一年端午 从福州到泉州 再到柴塔 连地名都好有神秘的感觉 迷糊的眼镜和疲倦的神情,刚好匹配得上 从此有了我们的传说 到了2022的七月七,还是一如既往 小特效 图…

lazada发货_Lazada发货用什么物流?费用要多少?

有买家到Lazada店铺下单之后,卖家就要安排订单发货了。Lazada发货的管控也是比较严格的,各位卖家要及时发货。小编也遇到不少新手卖家的咨询,问Lazada发货方式有哪些?以及发货流程是怎样的?下面针对这些问题&#xff0…

导入表格只有一行 帆软_万万没想到!把x个表格合合合合成一份,10分钟就搞定...

正值年中,老板交代把上半年各个地区提交的数据表格做个汇总。怎么办?一个地区一张表打开华南区的表,复制】-打开汇总表-【粘贴】再打开华北区的表【复制】-打开汇总表-【粘贴】……类似的工作任务还真不少各个单位上交的报名表各部门的生产计…

vim插件自动补齐_给VIM添加REPL

REPL: 读取-求值-输出”循环(英语:Read-Eval-Print Loop,简称REPL)是一个简单的,交互式的编程环境。python作为一个动态语言,REPL在开发过程中起到了很大的作用。可是一直以来用vim写python没有一个很好的&…

Linux ping 详细介绍(win也适用)

多数情况下,能否访问某台电脑或服务器,很自然的使用ping xxx.xxx.xxx.xxx,这是最简单的ping形式,同时看到ping几个包之后就停止(windows)了,linux 会一直ping下去,直到按ctrlc或其他组合键。在windows平台或linux平台&…

巨一自动化工业机器人_工业机器人和自动化设备连接器

来源:大比特商务网 作者:Ann Thryft随着工业物联网(IIOT)不断扩大,给工厂带来了更多电子设备。 这些设备往往暴露在恶劣环境中,包括灰尘、油、液体和极端温度等。 同时,特别是随着协作机器人装配在工厂生产线上&#x…

pvrect r语言 聚类_R语言常用统计方法包+机器学习包(名称、简介)

上期帮大家盘点了一下R中常用的可视化包,这期将简要盘点一下关于统计分析与机器学习的R包,并通过简要介绍包的特点来帮助读者深入理解可视化包。本文作者为“食物链顶端”学习群中的小伙伴,感谢他们的分享。话不多说我们一起来看看吧&#xf…

rap2检测哪些接口在使用_Apifox for Mac(接口调试管理工具)

Apifox 是一款用于接口文档定义、Mock 数据、接口自动化测试等等方面的工具,它的功能高效好用,接口云端同步,实时更新。成熟的团队/项目权限管理,满足各类企业的需求。有需要的朋友赶快来使用吧!Apifox 软件介绍软件开…

layui根据name获取对象_layui表格行合并;解决侧边固定栏合并

实现效果图:适配分页&#xff1b;全选&#xff1b;后台嵌套数据&#xff1a;获取数据后&#xff1b;渲染前操作&#xff1a;,done:function(res){if(res.data){for(var i 0;i<res.data.length;i){var trObj $([lay-id"table"] .layui-table-box).find([data-ind…

abap al设置单元格可编辑 oo_利用WPS做业务系统的超级编辑器

业务系统中的数据很笼统的分可以分为两大类&#xff0c;一个是结构化的&#xff0c;通常用关系型数据库来存储管理&#xff1b;一个是非结构化的&#xff0c;在这类数据中&#xff0c;可能最多、价值密度最大的就是文档。如何更便捷高效的生成或分析文档&#xff0c;就是业务系…

pyecharts怎么绘制散点图_pyecharts可视化和wx的结合

前言最近在研究 pyecharts 的用法&#xff0c;它是 python 的一个可视化工具&#xff0c;然后就想着结合微信来一起玩不多说&#xff0c;直接看效果&#xff1a;条形图.gif环境配置pip install pyechartspip install snapshot_seleniumpip install echarts-countries-pypkgpip …