OpenGL ES的应用

2018-03-30 02:26王玉峰
电子技术与软件工程 2017年16期

王玉峰

摘要

案例驱动的OpenGLES教学改革,突出了GLSL的核心地位,也和游戏引擎、Android、图形处理等技术做了一定的融合,还借鉴了优秀的英文网络教程并制作了在线案例,努力使课程丰富、生动起来。

【关键词】OpenGL ES 案例驱动

OpenGL作为图形硬件的软件接口,被广泛应用于计算机图形学理论研究、视频游戏开发、并行计算、计算机仿真、三维可视化等领域。随着OpenGL接口的进化,其日益强大、复杂,有必要将其作为一门单独的课程来教授。在教学实践中,限于课时数和学生基础,我们把OpenGL ES(OpenGL的嵌入式设备版本)作为主线来讲解,而且尝试将基础知识的讲解与其它课程、技术结合起来,增强课程的吸引力和授课效果。

1 OpenGL ES及其授课面临的挑战

Android、IOS两个手机操作系统均对OpenGL ES提供了良好的发展。随着智能手机的普及,OpenGL ES的应用范围得以大范围扩展,其也得以蓬勃发展。

用户界面、视频游戏等都依赖于OpenGL去驱动显示硬件来加速渲染,探究其后的原理、机制和技术,对于深入把握计算机图形学理论、理解游戏引擎、优化程序设计等都具有重要的现实意义。

OpenGL ES即使是作为OpenGL的裁剪版本,仍然是庞大的,把握其中的关键点尤为重要。渲染流水线、状态机两个机制,学生难以转换思维方式,需要花费较长的时间去理解。矩阵变换、光照计算涉及到数学运算和基本理论,学生学习起来相对枯燥吃力。

2 案例驱动OpenGL授课的相关实践

案例设计突出了以下几个要点:

2.1 实现固定渲染流水线功能,把4屋可编程流水线精髓

早期的OpenGL是固定渲染渲染流水线,从OpenGL 2.0(OpenGL ES也是从2.0)开始支持可编程渲染流水线,也即可以使用GLSL(OpenGL着色语言)来为图形硬件编写可在其上执行的程序(shader),大大增强了图形硬件的功能和灵活性。

固定渲染流水线时期的部分API(应用程序接口)已经不推荐使用,这意味着我们需要自己编写shader来实现固定流水线阶段提供的矩阵变换、光照计算等功能,这些功能在固定渲染流水线中是通过改变OpenGL内部状态就可以实现的。很多同学认为这非常不方便,但是系统化地去编程实现这些功能对于把握背后的图形学理论非常关键。

2.2 借鉴Cocos2d-x的着色器设计,讲解shader的基本运用

应用非常广泛的2D游戏引擎Cocos2d-x采用了OpenGL/OpenGLES作为底层渲染技术,它预定义了二十多组shader,用于濱染其中的精灵、UI组件、粒子、天空盒、地形等可视元素,这些shader并不复杂,容易理解,具有很好的借鉴价值,对于消除shader“神秘感”,开阔视野均有一定的价值。在教学实践中,我们选择了其中的一些shader.来进行分析,借以讲述顶点数据类型、顶点数据传输、shader间数据传递、片元颜色生成等。

2.3模仿Android动画相关类,实现基本的动态渲染

Android本身依赖OpenGL ES来进行硬件加速渲染,AndroidSDK(软件开发套件)也提供了对OpenGL ES的支持。除此之外,Android的基本动画机制容易理解,也很容易使用OpenGL ES来模仿实现。

Android动画中,巾贞动画对应的Java类是AnimationDrawable。在基本纹理濱染的基础上,增加随时间切换纹理的机制,就可以实现基本的帧动画。

Android的补间动画相关的Java类分別是AlphaAnimation、TranslateAnimation、ScaleAnimation、RotateAnimation。在基本纹理渲染的基础上,增加随时间改变目标片元颜色的alpha值的机制,就可以实现淡入淡出效果。同样,随时间改变顶点着色器中的模型变换矩阵,就可以实现位移、缩放、旋转的补间动画。

2.4 尝试进行基本的图像处理,深入了解片元着色器的功能

运用图形硬件进行基本的图像处理包括:颜色通道提取、图像彩色变成黑白、图像缩小及放大、图像倒置或水平镜像、图像裁剪、图像混合、图像遮罩显示、图像过渡渐变、图像增加噪声、去除背景绿幕等,还包括简单的利用卷积进行处理,如平滑过滤、边缘检测、锐化处理、浮雕效果等。

进行基本的图像处理大大激发了学生的学习兴趣,也加深了对片元处理器的理解,提高了shader的编写技能。

2.5 引入优秀网络教程相关案例,丰富实验内容和课余练习素材

OpenGL的经典书籍,比如《OpenGL超级宝典》、《OpenGL编程指南》等,涵盖面较广,篇幅较长,适合作为参考书籍。作为补充,有不少成体系的英文OpenGL网络教程,部分被一些热心的OpenGL爱好者翻译成中文。这些英文教程的案例具有很好的参考价值,大大丰富了课程实验内容。

网络教程中,比较突出的有leamopengl.com网站的《Leam OpenGL》、www.opengl-tutorial.org網站的《OpenGL Tutorial》、ogldev.atspacexo.uk网站的《Model Opengl Tutorials》、www.tomdalling.com网站的《Modem Opengl Serials》等,其中前两个都有中文译文。在课程实践中,要求学生把这些教程作为辅助读物。

3 课程改革实践的效果及改进方向

相比于计算机图形学课程,本课程侧重于程序设计,需要重点把握OpenGL的API使用和GLSL运用。以案例驱动为导向的课程实践,突出了程序设计的核心地位,也使得基础理论有了生动的外在“表象”,便于加深理解,使得理论和实践相辅相成。和C0C0s2d-x、Android、图像处理等技术进行一定程度的结合,使得课程更接“地气”,增加了课程的“亲和力”。过去几年的实践表明,学生普遍表示课程内容丰富、有趣。

参考文献

[1]王锐译.[美]DaveShreiner,Graham Sellers,John Kessenich,Bill Licea-Kane.OpenGL编程指南[M].北京:机械工业出版社,2015.

[2]姚军译.[美]Dan Ginsburg,Budirijanto Purnomo.OpenGL ES3.0编程指南[M].北京:机械工业出版社,2015.