前言:我做ios和android开发也很多年了,之前也用OpenGL做过一些效果,比如阅读器的翻页效果。但是一直没有系统的学习过这方面的知识,只是根据项目需求,查找一些文档或者下载一些demo进行修改。虽然当时效果是根据demo改出来了,但是很多原理性的知识还是比较欠缺的。所以现在开始系统的学习一下视觉方面的知识。
一、首先先了解一下有哪些图片API框架:
1.OpenGL (主要用于PC端)
2.OpenGL ES (主要用于嵌入式设备,ios、android 等)
3.DirectX (主要用于Windows)
4.Metal (苹果推出的框架,未来苹果将会弃用OpenGL)
二、区别一下OpenGL 、 OpenCV 的区别:
OpenGL主要是图形渲染的Api,OpenCV主要是用来做识别的,比如人脸识别,认证识别,两者是完全不同的领域,但是可以结合使用。
三、目前IOS底层是用什么渲染的呢:
2018之前用的是OpenGL ES, 之后用的是Metal。苹果迁移到Metal的原因是:“OpenGL只能做一些图形和图像的处理,并不能调度GPU做一些并发运算,编解码等,而Metal提供了这些入口”。但是OpenGL ES还是很有必要学习,包括我们现在做的直播项目,视频渲染底层仍然用到OpenGL ES。
四、图形图像API的专有名词:
1、上下文(context)
上下文相当于一个非常庞大的状态机,保存了OpenGL中的各种状态,记录了一些功能。我们做ios的时候用到CoreGraphics绘图的时候,会经常用到context,同时也类似于android里面的常用的context(比如Activity底层就继承一个抽象的Context类)。
2、渲染
将图片、视频等绘制到屏幕的过程。
3、顶点数组 & 顶点缓冲区
顶点就是我们在绘制图形时,它顶点位置的数据。类似在搭建了图形的框架。
顶点数组,就是把顶点存储到内存中。但是GPU在调度的时候,去读内存中的顶点信息会比较慢。而顶点缓冲区是把顶点数据存在GPU显存中,读取效率很快。
4、位图 (也叫纹理)
我们常用的png/jpg 是压缩图片,不能直接渲染在屏幕上,需要解压成位图,才能绘制到屏幕上。
比如 分辨率为100x100的位图,像素点就为 100x100=10000个像素点,每一个像素点都通过RGBA相应的存储。所以这张100x100的位图所占的内存为100x100x4 = 40000字节。这样看来一张位图很大,所有一般我们都用png/jpg等格式传输。
5、管线 & 固定管线 & 可编程管线
管线相当于一条流水线的加工过程。固定管线就是对应流水线中非常多的固定的模具(类似ios开发中,只能使用固定的api)。可编程管线就是在制造的过程中,可以自定义编程模具(类似ios开发中,可以自定义api)。
6、着色器 & 固定着色器(存储着色器)
着色器就相当于函数和方法(代码段),函数和方法是调度CPU工作的。着色器就是调度GPU工作的。
固定着色器(存储着色器)就是ios里面苹果提供的Api,只能调用,不能改写。
7、自定义着色器 (顶点着色器、片元着色器、几何着色器、曲面着色器)
就是自己基于GLSL语法来进行编写的代码段。
在ios里面目前只有 顶点着色器、片元着色器可以自定义。
8、顶点着色器
主要有3个功能(1)确定位置 (2)缩放/平移/旋转位置换算 (3)3D-2D投影换算
9、片元(像素)着色器
用来处理一个一个像素点,加入有100x100个像素点,就会执行10000次。因为GPU是并行运算,所以不会很慢。比如饱和度、模糊效果、滤镜等都是通过片元着色器完成的。
10、GLSL
OpenGL语言
11、光栅化
其实就是执行了2个过程(1)确定图形的像素范围 (2)把颜色附着上去。
12、混合
颜色混合行为,两种颜色叠加在一起的时候会进行混合运算。
13、变换矩阵 & 投影矩阵
变换矩阵就是图形发生平移、缩放、旋转变化。
投影矩阵就是将3D坐标转换为二维屏幕坐标。
14、OpenGL投影方式 (camera 观察者视角)
(1) 透视投影 (远小近大的效果,主要显示3D效果) (2)正投影 (主要显示2D效果)
15、坐标系
(1)2d坐标系 (2)3d坐标系 (3)摄像机(观察者)坐标系 (4)物体坐标系 (物体本身的坐标系)等等。更多坐标系以及坐标系转化,以后的文章中我会详细说明。
五、着色器渲染流程:
大致流程:顶点数据 -> 顶点着色器 -> 细分着色器 -> 几何着色器 -> 图元设置 -> 剪切 -> 光栅化 ->片元着色器 -> 效果
网友评论