一步步学习计算机视觉 in IOS(一)计算机视觉基础

计算机视觉,按字面上理解,就是计算机上用来处理人眼观测的技术。对于IOS而言,可以简单理解为在屏幕上绘制的技术。

对IOS App开发而言,在手机屏幕上展示的是一个个UIView,而大多数同学了解UIView的绘制是通过CALayer来完成的。我们平时使用的绘制API都是基于这套系统的。但是,对于硬件而言,图片实际上是通过GPU计算出渲染数据,通过显卡在屏幕上渲染像素。

对一般的App而言,CALayer提供的Api足以处理视觉上的需求,但是对游戏开发,视频开发而言,手机屏幕上很少能展示规则的图形,而且其UI变化率远高于普通App。这时我们就需要操作底层绘制组件来进行自己的绘制。

OpenGL, OpenGL ES, Metal

OpenGL(Open Graphics Library)是一个跨编程语言、跨平台的编程图形程序接口,它将计算机的资源抽象称为一个个OpenGL的对象,对这些资源的操作抽象为一个个的OpenGL指令。

OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口。

Metal 是一个是苹果出品类似的面向底层的图形编程接口,可以直接操作GPU;支持iOS和OS X,提供图形渲染和通用计算能力。苹果在ios 13上已经不再提供OpenGL ESKit,使用Metal来替换。

OpenGL

上下文(Context)

上下文Context在Android,UIGraphicsRenderer上都有应用,其意义是指执行代码的容器。对OpenGL而言,Context是指一个OpenGL状态机,在执行渲染、变换等视觉操作之前,需要先初始化这个容器状态机。这里要注意的是,OpenGL Context十分复杂,像UIGraphicsRenderer那样,每次绘制图片创建一个上下文不太合适,在实际应用中,系统可能在启动时初始化许多Context备用。

渲染管线

渲染管线也称为渲染流水线或像素流水线或像素管线,显示芯片内部处理图形信号相互独立的的并行处理单元。在实际应用中,渲染管线大致可以理解为渲染的步骤:

image.png

首先,我们以数组的形式传递3个3D坐标作为图形渲染管线的输入,用来表示一个三角形,这个数组叫做顶点数据(Vertex Data);顶点数据是一系列顶点的集合。
当其存储在内存时,称为顶点数组;而其存储在显存时,则称为顶点缓存
一个顶点(Vertex)是一个3D坐标的数据的集合。而顶点数据是用顶点属性(Vertex Attribute)表示的,它可以包含任何我们想用的数据,但是简单起见,我们还是假定每个顶点只由一个3D位置(译注1)和一些颜色值组成的吧。

1,顶点着色器

它把一个单独的顶点作为输入。顶点着色器主要的目的是把3D坐标转为另一种3D坐标(后面会解释),同时顶点着色器允许我们对顶点属性进行一些基本处理。

2,图元装配阶段

将顶点着色器输出的所有顶点作为输入(如果是GL_POINTS,那么就是一个顶点),并所有的点装配成指定图元的形状;

3,几何着色器

图元装配阶段的输出会传递给几何着色器(Geometry Shader)。几何着色器把图元形式的一系列顶点的集合作为输入,它可以通过产生新顶点构造出新的(或是其它的)图元来生成其他形状。

4,光栅化阶段

几何着色器的输出会被传入光栅化阶段(Rasterization Stage),这里它会把图元映射为最终屏幕上相应的像素,生成供片段着色器(Fragment Shader)使用的片段(Fragment)。在片段着色器运行之前会执行裁切(Clipping)。裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率。

5,片段着色器

片段着色器的主要目的是计算一个像素的最终颜色,这也是所有OpenGL高级效果产生的地方。通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色。

6,测试与混合

在所有对应颜色值确定以后,最终的对象将会被传到最后一个阶段,我们叫做Alpha测试和混合(Blending)阶段。这个阶段检测片段的对应的深度(和模板(Stencil))值(后面会讲),用它们来判断这个像素是其它物体的前面还是后面,决定是否应该丢弃。这个阶段也会检查alpha值(alpha值定义了一个物体的透明度)并对物体进行混合(Blend)。所以,即使在片段着色器中计算出来了一个像素输出的颜色,在渲染多个三角形的时候最后的像素颜色也可能完全不同。

固定管线与可编程管线

固定管线,也可称为可配置管线,其中的绘制渲染的算法不可配置,只能根据提供的Api进行配置。
可编程管线中,渲染算法是由传入的着色器程序shader来决定的。

着色器程序shader

Shader其实就是一段代码,这段代码的作用是告诉GPU具体怎样去绘制模型的每一个顶点的颜色以及最终每一个像素点的颜色。
Shader是一段代码,那必然要用一种语言来书写它,目前主流的有三种语言:
1)基于OpenGL的OpenGL Shading Language,简称GLSL。
2)基于DirectX的High Level Shading Language,简称HLSL。
3)基于C的C for Graphic,简称Cg语言
根据上面中提到的着色器流程,Shader有以下几种:
1)顶点着色器
图形有几个顶点执行有几次,用于处理理图形每个顶点变换(旋转/平移/投影等),坐标系变换。
2)几何着色器
几何着色器能够产生0个以上的基础图元,它能起到一定的裁剪作用、同时也能产生比顶点着色器输入更多的基础图元。
3)(像素)片段着色器
用于绘制图形中每一个像素点。

渲染/交换缓冲区(SwapBuffer)

帧缓冲区(显存):是由像素组成的二维数组,每一个存储单元对应屏幕上的一个像素,整个帧缓冲对应一帧图像即当前屏幕画面。

值得注意的是,如果每个窗⼝口只有⼀一个缓冲区,那么在绘制过程中屏幕进⾏行行了了刷新,窗⼝口可能显 示出不不完整的图像。因此引入了交换缓冲区。

常规的OpenGL程序⾄至少都会有两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像 在屏幕上的显示。交换一般会等待显示器器刷新完成的信号,在显示器器两次刷新的间隔中进⾏行行交换,这个信 号就被称为垂直同步信号,这个技术被称为垂直同步

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

推荐阅读更多精彩内容