iOS之OpenGL ES

GPUImage是当前做滤镜最主流的框架,没有之一。其中,OpenGL ES是框架的基石,因此,我们先从iOS的OpenGL ES学起。
本文的翻译地址:OpenGL ES 2.0 for iOS
很多人都听说过OpenGL ES 渲染管线,但都不太清楚这个术语确切的意思,那么,让我们一起来搞清楚吧。“管道”一词是指整个事件的顺序,从你告诉OpenGL ES开始做一些事情(通常叫做打底),到所有被提交的对象被绘制完成。通常,当一个OpenGL ES程序运行时,反复绘制,每个完成的图像为一帧。
OpenGL ES 2.0 之前(包含1.1,支持所有iOS设备)的使用被称为固定打底管道,也就是说OpenGL ES最后生成的图片没有让你处理的机会。一个更好的术语“闭合管道”更符合它,因为你从一段塞入东西,它在另一段输出另外一个东西,当它开始进入管道时,你没有能力去影响它。
在固定管道中,整个图片是根据你通过程序预先定义好的接口调用时提交给OpenGL ES的参数来打底的。每一次OpenGL ES 1.x打底一些东西时,用的是一样的算法和计算。如果你想要一个道光线,举个例子,你需要在应用代码中调用一大把OpenGL ES的函数来定义你需要的这道光线的类型,光线的位置,光线的强度,也可能一些其他的属性。然后,OpenGL ES1.1会带着你提供的信息,做出将光线加入到你的场景所需的全部运算。它会计算如何遮挡你的物体,以便于它们看起来像是光线照射到它们上面,并相应的绘制它们。固定管道是你和很多事物隔绝。它从根本上来讲,“噢,亲爱的 … 把你的场景信息给我,不要担心你的漂亮的小脑袋关于所有的数学。”
固定管道编程的好处是它在概念上很简单容易。当你学起来时会感觉不容易,但是,相较于可编程管道,最基本的是更容易掌控。是不是想建立一个页面来验证观点?如果你使用一对接口来提交一大把输入,OpenGL ES基本上会为你完成。想要移动,旋转,或者缩放一个物体?这也有很多函数提供给你去做这些。想要给你的场景添加一道或者六道光线?仅需要在每道光线绘制前,做很少的调用,然后就没你事了。
固定管道编程的缺点是限制你做想做的事。很多你想要的光线和你能在现代化的3D游戏中见到的有质感的效果,举个例子,用固定管道很难(或者不能)实现。用固定管道,你只能做绘制库作者认为你可能需要,你可能需要做的方法。想要一个透明的火光或者有立体感的土地?好吧,你通过固定管道又可能找到一些方法实现这类事情,但那不会很容易。人们已经想出了一些很巧妙的方法来打破固定管道的限制。但是尽管您通过绕开管道限制确实实现了一些效果,你的代码看起来像一个hack,更重要的是,相对于最好的程序,一些你用来实现的功能代码很可能运行在错误的地方。因为一旦我们开始使用可编程管道,它是一个关键的信息片段。

硬件结构
OpenGL ES将你与特殊硬件的代码隔离,但是,了解它还是很重要的,至少在一个很高的水平,iOS设备是怎样计算和展示图像内容的。以往每台iOS设备都有两个处理器。它们都有一个通用用途的处理器叫做CPU,也有一个第二处理器GPU,代表了绘制程序单元。CPU可以做所有你需要做的事情,并且它是你的应用代码主要运行的地方。CPU在处理整数运算是很快,但是在做浮点数运算是就没那么快了。另一方面,GPU更专业,它更擅长浮点数等大数字的计算非常快。它被设计来辅助CPU来处理那些CPU不是很擅长的任务,而不是作为一个独立的处理器。CPU,本质上,着手于确定的任务,GPU更擅长运行中的。随着两个处理器平行的工作,设备每次能做更多的工作。但是这种“相互帮助”在程序中并不会自动发生。
当你用Xcode写C,Objectice C,或者c++代码时,编译后的二进制代码在CPU上执行。有很多库,像CoreAnimation,会为你考虑,将任务交个GPU处理。但是通常来讲,你需要特殊的库来获取进入GPU的方式。非常幸运的是,OpenGL ES就是这样一种库,固定通道和可编程通道的打底工作都是在GPU中进行。这样是有道理的,如果你想到她:图形的计算是GPU被设计来做的。很多OpenGL ES 2.0的管道,像所有的固定管道,是在你的控制之外的。然而,有两个特殊的地方你能编写代码。你写的代码在GPU上运行,不能使用C,OC和C++编写。它必须用为特殊目的设计的特殊语言来编写。你为可编程管道写的程序在GPU上运行,并被称为着色器。你写入着色器的语言叫GLSL,是GL Shading Language的缩写。
着色器这个术语是OpenGL ES中非直观命名的另一个例子。着色器无非是替代CPU运行在GPU上的一段可执行的代码片段。在任务中,它们的角色是计算代表虚拟物体的每个像素的阴影,但是它们能做的还有更多。着色器在图灵编程语言中是一个非常完善的程序。

OpenGL ES Shaders

Vertex Shaders

Fragment Shaders

Sending Data to the Shaders

Attributes

Uniforms

Varyings

OpenGL ES Programs

Sending Attributes and Uniforms to the Shaders

Submitting Uniforms

Submitting Attributes

Drawing to a Close

未完,待补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值