初识 OpenGL ES2.0
原文链接:Android OpenGLES2.0(一)——了解OpenGLES2.0
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。
OpenGL(Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。
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的。Android 1.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 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中有两种投影方式:正交投影和透视投影。正交投影,物体不会随距离观测点的位置而大小发生变化。而透视投影,距离观测点越远,物体越小,距离观测点越近,物体越大。
光照
OpenGL ES 2.0采用的光照模型相对真实世界的光照是进行了很大的简化。在OpenGL ES 2.0中,光照由三种元素组成(也可以说是三种通道组成),分别为环境光、镜面光及散射光。 - 环境光是指从四面八方照射到物体上:
- 散射光是指现实世界中粗糙的物体表面被光照射时,反射光在各个方向基本均匀的情况:
- 镜面光是指现实世界中光滑的表面被照射时会有方向很集中的反射光,与散射光最终强度依赖于入射光与被照射点的法向量夹角不同,镜面光的强度还依赖于观察者的位置:
纹理映射
现实世界中的物体往往是绚丽多彩的,要模拟现实世界的绚丽多彩,绘制出更加真实、酷炫的3D物体,就需要用到纹理映射了。纹理映射是将2D的纹理映射到3D场景中的立体物体上。
OpenGL ES 2.0渲染过程为:
读取顶点数据——执行顶点着色器——组装图元——光栅化图元——执行片元着色器——写入帧缓冲区——显示到屏幕上。 - OpenGL作为本地库直接运行在硬件上,没有虚拟机,也没有垃圾回收或者内存压缩。在Java层定义图像的数据需要能被OpenGL存取,因此,需要把内存从Java堆复制到本地堆。
- 顶点着色器是针对每个顶点都会执行的程序,是确定每个顶点的位置。同理,片元着色器是针对每个片元都会执行的程序,确定每个片元的颜色。
- 着色器需要进行编译,然后链接到OpenGL程序中。一个OpenGL的程序就是把一个顶点着色器和一个片段着色器链接在一起变成单个对象。
借鉴文章出处
初识 OpenGL ES2.0相关推荐
- Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤
1. 先按照http://blog.csdn.net/fengbingchun/article/details/10439281中操作搭建好基本的Android开发环境: 2. 打开Eclipse ...
- OpenGL ES的性能范围(OpenGL ES2.0官方文档)
http://blog.csdn.net/mengtnt/article/details/7773304 OpenGL ES 1.1和OpengGL ES2.0的规范中,都定义了每种实现必须支持的最低 ...
- iOS OpenGL ES2.0教程 Lesson03 旋转
iOS OpenGL ES2.0教程 Lesson03 旋转 注:可供翻译的课程只有前两课.从这节课起,我试着根据我对OpenGL ES的理解写接下去的课程,希望能和大家一起学习. 在上节课中 ...
- OpenGL ES2.0 – Iphone开发指引
原文链接地址:http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial 免责申明(必读!):本博客提供的所有教程的翻译原稿 ...
- opengl es2.0 渲染文字
在OpenGL 家族中是没有提供直接渲染文字的接口,所以我们要在opengl中显示文字,就需要借助于其他的三方库或者自己解析绘制文字,然后使用opengl中的绘制接口去渲染出文字 这里我使用的free ...
- opengl es2.0 使用字符偏移图渲染文字
在OpenGL 家族中是没有提供直接渲染文字的接口,所以我们要在opengl中显示文字,就需要借助于其他的三方库或者自己解析绘制文字,然后使用opengl中的绘制接口去渲染出文字 这里我使用的free ...
- android双指滑动方向,OpenGL ES2.0实现手指滑动平移、双指缩放Android
主要是实现了手指在屏幕上滑动实现平移,两个手指进行缩放.主要是这部分矩阵还挺麻烦的. 效果图如下所示: 核心部分代码如下 触控事件处理: @SuppressLint("ClickableVi ...
- openGL es2.0 粒子系统之烟花
一.Java代码 package com.gzdxid.particles;import java.nio.ByteBuffer; import java.nio.ByteOrder; import ...
- Android 基于OpenGL ES2.0 的CircleProgressBar
之前想在播放器上加一个那种卡顿的转转提示: 类似: https://github.com/lsjwzh/MaterialLoadingProgressBar 这种效果的 由于当时没想到怎么在openg ...
最新文章
- objc runtime 动态增加属性
- 清华朱文武团队斩获NIPS 2018 AutoML挑战赛亚军,高校排名第一
- Dijkstra的算法
- 软件测试2019:第一次作业
- 全球首个AI设计药物进入人体试验阶段
- 重要接口—Cloneable接口
- 搜索引擎重复网页发现技术分析
- linux下如何升级gcc和g++编译器
- java程序设计基础(第3版)实验指导_清华大学出版社-图书详情-《Java程序设计基础(第5版)实验指导与习题解答》...
- 小米路由器3 保姆级救砖回忆录及实操技巧演示
- 斐波那契数列(Java递归)
- 强化学习——Q学习算法
- 大学四年,学了这些计算机基础知识,成为了别人眼中的大神
- 【Matlab】图像裁剪函数imcrop的原点、长度、宽度问题
- html 百分比饼状图,highcharts饼状图百分比显示的数据和写的不同
- MPC与LQR的详细对比分析
- 插鼠标出现 usb设备无法识别 解决办法
- SSM框架报错分析(一)——There is no getter for property named 'XXX' in 'class java.lang.String'...
- 如何买到便宜的云服务器
- 遇到bug我们如何分析定位?