随着Android 4.3 陆续泄漏事件,终于在 Nexus 4 上见到了 OpenGL ES 3.0 的身影, 说起 OpenGL ES 可能大家对此知之甚少,不过 OpenGL 对很多游戏玩家来说应该是印象深刻的,虽然不像 DirectX 那么频繁的出现需要更新,但也总有一两个游戏需要。OpenGL ES 可以理解为是 OpenGL 的精简版,多用于移动平台产品,本期雷锋科普就来讲讲 OpenGL ES- 嵌入式3D图形算法标准。
OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的应用程序接口(API)的规格,它用于生成二维、三维图像。这个接口由近三百五十个不同的函数调用组成,用来从简单的图形绘制复杂的三维景象。而另一种程序接口系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟实境、科学可视化程序和电子游戏开发。OpenGL的高效实现(利用了图形加速硬件)存在于Windows,很多UNIX平台和MacOS。这些实现一般由显示设备厂商提供,而且非常依赖于该厂商提供的硬件。开放源代码库Mesa是一个纯基于软件的图形API,它的代码兼容于OpenGL。OpenGL规范由1992年成立的OpenGL架构评审委员会(ARB)维护。ARB由一些对创建一个统一的、普遍可用的API特别感兴趣的公司组成。根据OpenGL官方网站,2002年6月的ARB投票成员包括3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland、Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI和Sun Microsystems,Microsoft曾是创立成员之一,但已于2003年3月退出(微软曾经试图融合DirectX 和 OpenGL,不过最终放弃了,微软的DirectX起初的战略是为了推动DOS游戏开发者转向Windows,从此之后它就被绑定在Windows下为PC游戏服务,所以它仅支持Windows)。
OpenGL™ 是行业领域中最为广泛接纳的 2D/3D 图形 API, 其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。OpenGL™ 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL™ 帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。OpenGL ES 是从 OpenGL 裁剪定制而来的,去除了 glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性。经过多年发展,现在主要有两个版本,OpenGL ES 1.x 针对固定管线硬件的,OpenGL ES 2.x 针对可编程管线硬件。OpenGL ES 1.0 是以 OpenGL 1.3 规范为基础的,OpenGL ES 1.1 是以 OpenGL 1.5 规范为基础的,它们分别又支持 common 和 common lite 两种profile。lite profile只支持定点实数,而common profile既支持定点数又支持浮点数。 OpenGL ES 2.0 则是参照 OpenGL 2.0 规范定义的,common profile发布于2005-8,引入了对可编程管线的支持。
Open GL ES 3.0
在 2007 年 8 月,初代 iPhone 和 Android 都内置了 OpenGL ES 1.x;2009 年 10 月,iPhone 3GS 和 Android 2.2 内置了 OpenGL ES 2.0。结果 OpenGL ES 在移动市场的占有率大增,从 2006 年的 20% 到今年的 90% 以上。在昨天的 SIGGRAPH 2012 大会上,科纳斯组织(Khronos Group)公布了新版本 OpenGL ES 3.0。
OpenGL ES 3.0 带来很多新特性:
1、支持更多缓冲区对象。在 OpenGL ES 2.0 时中,缓冲区对象的规范有模糊之处。名字一样缓冲区对象,在实际渲染中对表现却有细微的差别。针对这个问题 OpenGL ES 3.0 制定了更详细对格式规范。新版 OpenGl ES 还增加对 Uniform Buffer Object 的支持。
2、新版 GLSL ES 3.0 着色语言,支持 32 位整数和浮点数据类型以及操作。之前版本的着色语言只支持精度更低的,这样虽然能够加快计算的速度,所需的资源也更少,但当着色器的复杂度增加,出错也随之增加。同时,新版着色语言的语法更贴近 GLSL。
3、支持遮挡查询(Occlusion Query)以及几何体实例化(Geometry Instancing)。通过遮挡查询,能够让 GPU 知道 3D 场景中,哪些物体被其它物体完全遮挡,这些完全被遮挡的物体 GPU 不会去渲染。几何体实例化是通过对具有相同顶点数据的几何体,赋予不同的空间位置、颜色或纹理等特征,从而创造出不同实例对象的技术。这两个特性都能够节省硬件资源,提高 3D 图形渲染的性能。
4、增加多个纹理的支持。包括浮点纹理、深度纹理、顶点纹理等等。
5、多重渲染目标(Multiple Render Targets),让 GPU 一次性渲染多个纹理。
6、多重采样抗锯齿(MSAA Render To Texture),让 3D 物体对边缘不出现毛刺,可提升图像效果。
7、使用统一的纹理压缩格式 ETC:多年来阻碍 OpenGL 发展的一大顽疾,就是没有统一的纹理压缩格式,包括 S3TC、GPUs、PVPRTC、ETC 等等。因为没有一个统一标准,开发者不得不因为不同的硬件环境而将纹理重复压缩多次——尤其对于 Android 开发者而言,这个过程苦不堪言(对用户来说也有大量的烦恼,比如安装游戏数据包时需要自己来识别需要哪种材质的数据包)。显然,统一纹理压缩格式,能够提高开发者对开发效率。但现实中,统一标准这类事情的进展从来没有快过。这视乎之后开发者与厂商会做出怎样的反应。
Android 4.3 升级到 Open GL ES 无疑是一个好的开始,OpenGL ES 3.0 大量的新特性完全加持,将大幅提高移动平台图形特性,提高游戏图形效果。