GPUImage源码解析 -- OpenGL ES基础

GPUImage是一个开源的图像处理工具,它基于OpenGL ES实现,Git地址为:https://github.com/BradLarson/GPUImage。GPUImage最大的好处是它提供了一套非常好的图像处理架构,并且提供了各种PhotoShop中常见的滤镜的着色器。使用者只需要通过对这些滤镜的组合,即可实现非常好的滤镜效果。安卓版也有一个GPUImage:https://github.com/CyberAgent/android-gpuimage,但是这个版本远远没有iOS版本的强大功能,支持的特性也相对少很多。最近项目中需要在Android上也实现一个滤镜框架,那就顺便详细研究一下GPUImage的源码,然后自己实现一个安卓版啦。


OpenGL ES基础

OpenGL ES是基于OpenGL简化而来的用于嵌入式系统的图像处理框架,基本上所有的嵌入式系统的图像渲染最终都基于OpenGL ES。OpenGL ES提供了强大的图形处理能力,以及完善的上下文让系统能将CPU中的数据传输到GPU中,并且进行渲染。GPUImage也是基于OpenGL ES实现的。因此,了解一些OpenGL ES的基础对于理解GPUImage的源码也是非常有帮助的。

简单的术语:

Vertex(顶点):在OpenGL中,所有的物体都是由顶点拼凑而成的,即使是一个圆或者一个球。每个球也是通过分解成非常小的三角形进行渲染的。OpenGL中,渲染的最小元素包括三角形(GL_TRIANGLES),线(GL_LINES)以及点(GL_POINTS)。因此,他们都需要由顶点来定义他们在坐标系中的位置;

Fragment(片元):在OpenGL中,所有的显示都是由片元来完成的,OpenGL通过着色器为每一个片元设定颜色,然后GPU通过这些片元的颜色进行渲染。Fragment可以说是OpenGL显示的最小单元。

Texture(纹理):纹理是一个包含元素信息的对象,OpenGL通过读取纹理中的每个纹素(Texel)的颜色来给不同的片元进行上色。

Shader(着色器):OpenGL中包含了两种着色器,顶点着色器(VertexShader)以及片元着色器(FragmentShader)。着色器使用的是Shading Language进行书写,相当于是另一门语言了,这里就不具体介绍了,有兴趣的同学可以参考https://www.khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.3.30.pdf。

    VertexShader:主要作用是确定每个顶点在渲染坐标系中的位置,并且确定每个顶点的纹理位置坐标;

    FragmentShader:通过每个顶点的纹理坐标和纹理,给每一个片元进行上色。

坐标系(Coordinate System):OpenGL之所以能够很好地实现3D的效果,就是因为有一个非常完善的坐标系系统,这些坐标系系统可以将一个点从自己的坐标系映射到屏幕中的3D位置。坐标系之间的变换通常通过矩阵进行,包括Model-View-Projection矩阵,简称MVP Matrix。

    Model Matrix是将一个点的位置从自己的坐标系映射到周围环境中(world coordinate);

    View Matrix是将点的位置从世界坐标系中,通过调整眼睛(或者说摄像头)的位置,展示同一个物体不同方面的景象;

    Projection Matrix则是将点的位置最终转化成在屏幕上显示的位置;

由于GPUImage中主要实现的是2D的图片处理,并没有涉及到太多的3D效果,因此基本没有涉及到MVP矩阵变换。

帧缓存(FrameBuffer):我们在移动设备屏幕上看到的显示其实都是一帧一帧的内存。因此OpenGL使用了帧缓存的机制,现在缓存中完成渲染,然后再将渲染好的帧呈现到屏幕上。其实在OpenGL中,还有很多的Buffer,如RenderBuffer, DepthBuffer, Vertex Buffer, IndexBuffer等等,我们在使用到的时候再进行具体介绍。

上下文(EGLContext):EGLContext是OpenGL用来渲染的一个上下文,包含了很多的环境变量。在不同的系统中,都有不同的实现,在iOS中,已经封装好的EAGLContext就非常容易使用了;而在Android中,如果需要自己控制每一个显示的环节的话,则需要自己创建EGLContext。

Shader中的常用术语:

Attribute: 在Shader中,有些属性是针对每个顶点都不同的,比如它们的位置(position),纹理坐标(TextureCoordinate),这些信息必须要在CPU中计算好,然后放入VertexBuffer或者VertexBufferObject中;GPU会在VB或者VBO中读取到这些信息,才能计算出每个顶点显示的位置;

Uniform:不同于Attribute,uniform是对于所有的顶点或者片元都相同的一些参数,比如MVPMatrix,Sampler以及一些其他的环境变量;

Sampler:采样器,OpenGL通过Sampler和TextureCoordinate来确定一个片元的颜色。


OpenGL ES 渲染流程

1. Vertex Specification: 这个过程中,主要是计算出每个顶点在自己坐标系中的位置,并且将顶点的Attributes放置到VertexBuffer中,GPU会通过VertexBuffer中的信息读取到每个顶点的Attribute并进行处理;

2. Vertex Processing: 这个过程主要通过VertexShader以及MVP Matrix获取到每个顶点的位置;

3. Primitive Assembly: 在顶点的信息确定完成了之后,通过Primitive Assembly将这些顶点拼成最终需要显示的图形;

4. Rasterization:栅格化的过程是将图形的立体位置转换成在屏幕上显示的位置的过程;

5. Fragment Processing:通过采样器,纹理坐标给每个片元进行着色;

6. Per-Fragment Operation:在每个片元的颜色确定了之后,还可以对每个片元进行一些操作,比如Stencil Test,Depth Test等等。

这边主要是介绍了一些OpenGL ES的基础,以便更好的理解GPUImage的源代码,现在一切就绪,我们就可以开始撸代码啦!


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容