大家可能对图形编程有些陌生,往小了说,我们在计算机或手机上玩游戏时,看到的一些3D特效,都是通过图形编程实现的。往大了说,无论是Windows、iOS还是Android,能看到的界面本身就是图形编程的杰作。
图形编程面临的一个最基本的问题就是如何用程序在显示器上绘制东西,比如一个按钮、一张美女图片、一个正在放“大招”的英雄。简单来说,有两种绘制方式:一种是CPU在内存里准备好了要绘制的东西,然后交给显示器显示;另一种是显卡在显存里准备好要绘制的东西,交给显示器显示。前者称为软件绘制,因为CPU本身并不擅长做图形相关的运算,效率也就高不到哪儿去。后者称为硬件加速,显卡天生就是用来处理图像的,所以效率很高。这也就是为什么我们常说大型游戏“吃显卡”,但只需要一个入门级的CPU就能流畅运行了,因为在它们运行的时候,CPU其实是个配角。
那么问题来了,如何才能充分调动显卡的强大能力,帮助我们绘制图形呢?OpenGL就是为此而生的。OpenGL是一组API,这些API可以运行在不同的平台上,可以支持各种语言。最重要的是,它能利用显卡的硬件加速能力,帮助我们绘制图形。
有700多个API,每个API代表一种能力,比如其中有一个叫glClearColor,可以把屏幕涂成用户想要的颜色。OpenGL 得以流行,还有一个很重要的原因是跨平台。无论用 C++语言写程序,在PC上运行,还是用Objective-C语言写程序,在iOS上运行,都能用OpenGL。Java能够实现跨平台是因为它下面有一个虚拟机,不同的平台都做了兼容,给上层调用的都是一样的API。OpenGL也是这样做的。用OpenGL做图形编程,根本不用担心平台不适配问题,因为已经有人把这些脏活累活都做了,适配好了。但是读者可千万不要误会,以为OpenGL就只是几百个API。
实际上它有自己的一套规则。在任何一本介绍OpenGL的书上,都能看到这样一句话:OpenGL是一个状态机。什么意思呢?状态机控制很多状态不停地切换。OpenGL的几百个API里,有不少是用来设置状态的。每次设置一个状态,都是一次状态切换,直到最终绘制完成。比如设置画笔的颜色是红色,那么之后绘制的所有图形都是红色的,直到设置成绿色,后面才会绘制绿色的图形。
我们用地图导航举例。当用户选定了目的地之后,导航路线就生成了。用户可以把整条路线里的每一条小路当作一个状态,每进入一条小路就切换一次状态。这样经过一个又一个的状态切换,最后会到达目的地。
对OpenGL来说,状态切换过程结束,绘制任务就完成了。OpenGL的绘制流程大约要经过几个步骤。首先,要把要画的东西拆成三角形之类的基本图形,然后在三维空间坐标系里给它们安排合适的位置,之后把灯光加上去,使要画的东西有一种立体感,最后,把这些东西转化成屏幕上的像素点(即光栅化),整个绘制就算是完成了。OpenGL这两年比较火,主要还是因为iOS和Android都靠它来做游戏、写界面。严格地说,在移动平台上,大家用的是OpenGL-ES,是OpenGL的一个子集。
OpenGL 有700多个API,OpenGL-ES 裁掉了其中不常用的、移动端不好用的一些API。麻雀虽小,五脏俱全,OpenGL-ES也可以充分发挥显卡的硬件加速能力,让手机界面操作如丝般顺滑。
领取专属 10元无门槛券
私享最新 技术干货