图形API简介
- OpenGL (Open Graphics Library)是一个跨编程语言、跨平台的编程图形程序接口,主要解决PC端的图形图像的处理和渲染问题。
- OpenGL ES (OpenGL for Embedded Systems)是 OpenGL 三维图形 API 的子集,针对⼿机(安卓、iOS)、 PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口。
- DirectX 是由很多API组成的,DirectX并不不是一个单纯的图形API. 最重要的是DirectX是属于 Windows上一个多媒体处理框架.并不支持Windows以外的平台,所以不是跨平台框架. 按照性质分类,可以分为四大部分,显示部分、声音部分、输入部分和⽹网络部分。
- Metal: Apple为游戏开发者推出了新的平台技术 Metal,该技术能够为3D图像提⾼10 倍的渲染性能。Metal 是Apple为了解决3D渲染⽽推出的框架。
OpenGL VS OpenCV
- OpenGL:主要用作于渲染,将位图显示出来。
- OpenCV:主要用来做图形图像识别,另一个做图像识别的是face++。
OpenGL VS Metal
- 2018年之前,CoreAnimation基于OpenGL ES 封装的上层框架;2018年底层迁移到了metal。
- OpenGL ES是第三方的框架,无法契合自己项目的个性化定制。
- 为以后的图形图像做一个布局。
图形API解决的问题
简单来说就是实现图形的底层渲染。
- 系统针对按钮,图片,视图,图层的渲染问题。
- 游戏引擎->人物场景的渲染(图形API)。
- 视频播放框架,视频解码->渲染。
- 核心动画->动画操作(旋转、缩放、移动、图层特效)。
- 视频/图片->特效(图形API)。
OpenGL /OpenGL ES/ Metal 在任何项目中解决问题的本质,就是利用GPU芯片来高效的渲染图形图像。
图形API是iOS开发者唯一接近GPU的方式。
OpenGL专有名词解析
状态机
- 状态机是理论上的一种机器,它描述了一个对象再其生命周期内所经历的各种状态,状态间的转变,发生转变的动因,条件以及转变中所执行的活动。
- 也可以认为它是一种行为,说明对象在其生命周期中响应事件所经历的状态序列,以及对那些状态事件的响应。因此它具有以下特点。
- 有记忆功能,能记住其当前的状态。
- 可以接受输入,根据输入的内容和自己原先的状态。修改自己当前的状态,并且可以有对应的输出。
- 当进入特殊状态(停机状态)的时候,就不在再接收输入,停止工作。
上下文Context
- 在应用程序调用OpenGL的指令前,需要首先安排创建一个OpenGL的上下文。这个上下文是一个非常庞大的状态机,它保存了OpenGL的各种状态,这也是执行OpenGL的基础。
- OpenGL的函数不管在哪个语言中,都是类似C语言一样的面向过程的函数,本质上都是对OpenGL上下文这个庞大的状态机中的某个状态或者对象进行操作。当然你得首先把这个对象设置为当前对象。因此,通过对OpenGL指令的封装,是可以将OpenGL相关的调用封装成一个面向对象的图形API。
- 由于OpenGL上下文是一个巨大的状态机,切换上下文往往会产生较大的开销,但是不同的绘制模块,可能需要使用完全独立的状态管理。因此,可以在应用程序中创建多个不同的上下文,在不同的线程中使用不同的上下文,上下文之间共享纹理、缓冲区等资源。这样的方案会比反复切换上下文,或者大量修改渲染状态,更加的合理高效。
渲染
图片、按钮、视频,绘制到屏幕上的过程称之为渲染。解码->渲染。
顶点数组和顶点缓冲区
- 顶点数组:将顶点数据存储到CPU内存中。
- 顶点缓冲区:将顶点数据存储到GPU的显存中。
位图
120*120的图片有14400个像素点。每个像素点RGBA -> 14400 * 4 = 位图(纹理)。
映射:对应关系,将位图映射到屏幕。
管线
可以理解为流水线。比如将肥皂->肥皂水->模具->肥皂块。这样的流程就可以称之为管线。
固定管线
固定管线,会对应很多模具,不可编辑,模具对应多种着色器。
可编程管线
可以自定义编写的模具。使用GSL语法驱使GPU。
着色器
shader(代码段)供GPU使用。
固定着色器
苹果提供的API(代码段)调用API。
自定义着色器
可以自己基于GSL语法来编写的代码段。
顶点着色器,和片元着色器数据自定义着色器。
顶点着色器
- 确定位置
- 缩放、平移、旋转。位置换算。
- 手机端显示3D效果。手机属于2D,将3D数据转换为2D,显示到手机屏幕上。
片元着色器
片元也叫像素,片元着色器也叫像素着色器。它是用来处理一个一个像素点的。
GPU是并行运算,计算能力比CPU高。
比如要调整图片的饱和度,就需要使用片元着色器一个像素一个像素的去调整。
GLSL(OpenGL着色语言OpenGL Shading Language)
遵循OpenGL的标准来调度GPU来做计算。
光栅化
- 是把顶点数据转换为片元的过程,具有将图转化为一个个栅格组成的图象的作用,特点是每个元素对应帧缓冲区中的一像素。光栅化就是把顶点数据转换为片元的过程。片元中的每⼀个元素对应于帧缓冲区中的一个像素。
- 光栅化其实是一种将⼏何图元变为二维图像的过程。该过程包含了两部分的工作。第一部分工作:决定窗口坐标中的哪些整型栅格区域被基本图元占用;第二部分⼯作:分配⼀个颜色值和一个深度值到各个区域。光栅化过程产⽣的是片元。
- 把物体的数学描述以及与物体相关的颜色信息转换为屏幕上用于对应位置的像素及用于填充像素的颜色,这个过程称为光栅化,这是一个将模拟信 转化为离散信号的过程。
纹理
可以简单理解为图片,纹理的文件格式为.tga。纹理就是位图。
混合
两个不同背景颜色的layer叠加在一起,会发生一个图层混合计算。
变换矩阵
记录旋转,平移、缩放。
投影矩阵
将3D坐标,变换为2D坐标的过程。
投影方式
正投影
图像不管远近,都是1:1绘制。用来显示2D效果。
透视投影
观察这视角。就像是我们人看东西一样,符合远小近大的效果。
网友评论