一、图形API简介
(Open Graphics Library)是⼀个跨编程语⾔、跨平台的编程图形程序接⼝,它将计算机的资源抽象称为⼀个OpenGL的对象,对这些资源的操作抽象为⼀个的OpenGL指令。
(OpenGL for Embedded Systems)是 OpenGL三维图形 API 的⼦集,针对⼿手机、 PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口。
是由很多API组成的,DirectX并不不是⼀个单纯的图形API. 最重要的是DirectX是属于 Windows上⼀个多媒体处理理API。并不支持Windows以外的平台,所以不是跨平台框架, 按照性 质分类,可以分为四⼤大部分,显示部分、声⾳音部分、输⼊入部分和⽹网络部分。
: Apple为游戏开发者推出了了新的平台技术Metal,该技术能够为 3D 图像提⾼ 10 倍的渲染性能。Metal是Apple为了解决3D渲染⽽而推出的框架。
A.比如在游戏开发中,对于游戏场景/游戏人物的渲染
B.比如在音视频开发中,对于视频解码后的数据渲染
C.比如在地图引擎,对于地图上的数据渲染
D.比如在动画中,实现动画的绘制
E.比如在视频处理中,对于视频加上滤镜效果
OpenGL/OpenGL ES/Metal 在任何项目中解决问题的本质就是利用GPU新品来高效渲染图形图像。图形API是我们iOS开发者唯一操作GPU的方式。
二、名词概念
在应用程序调用任何openGL指令之前,首先得创建openGL的上下文 类似于我们使用对象(object) 之前得初始化 这个上下文是一个非常庞大的状态机 保存了openGL中的各种状态
OpenGL 的函数 本质上都是对openGL上下文这个状态机中的某个状态或者对象进行操作 对openGL指令的封装 是可以将openGL的相关调用封装成一个面向对象的API
openGL上下文是一个巨大的状态机 切换上下文一般会产生巨大的开销 但是绘制不同的模块 可能会需要使用完全独立的状态管理 基于此 可以在程序中创建多个不同的上下文 在不同的线程中使用不同的上下文 不同的上下文之间可以共享纹理 缓冲区等资源 这种工作方式 会比反复切换上下文 或者大量修改渲染状态 会更加的高效
描述了一个对象在他的生命周期内经历的各种状态 发送转变的原因 状态间的转变 转变的条件 转变中执行的活动 。具有以下的特点
有记忆功能 能记住当前的状态
可以接受输入 根据输入的内容 和自己原来的状态 来修改自己当前的状态 并且可以有对应的输出
当前进入特殊的状态比如说停机状态的时候 就不再接受输入 停止工作
将图像数据(一组3D坐标)转换成屏幕和窗口中2D的有颜色的像素的操作就叫做渲染。
不管是2D图像还是3D图像,图像的轮廓(或者说图像的骨架更合适)都是由一些特殊的点连线组成,这些特殊的点就叫顶点,比如一个四方形有4个顶点,一个四方体有8个顶点。有人可能会有疑问,四边形五边形这些图形的顶点好理解,但是向圆形这样的图形也有顶点吗?是的,我们可以想象一下,如果我们用4个点把一个圆周等分成4分,然后把这4个点连起来就是一个正方形,如果用8个点等分连起来就是一个正八边形,如果是20个点的话就是正20边形,我们会发现等分的点越多,这些点连起来的图像就越接近圆,所以可以理解为这些点就是圆的顶点。
在使用OpenGL时,开发者在绘制图像之前会将图像的顶点数据存入一个数组中,这个数组就是顶点数组,它是存在内存中的。在调用绘制方法时直接去内存中取这些顶点数据进行绘制。
为了提高性能,会提前分配一块显存,将顶点数据预先传入显存中,这部分显存区域就被称为顶点缓冲区。
纹理可以理解为是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;需要将png转换成位图,所以纹理又是位图;
纹理也可以被用来储存大量的数据,可以发送到着色器上;
将平时的jpg/png图片转换成位图,位图即为纹理;
管线包含一系列处理阶段,定点数据和像素数据进入管线进行处理,最后组合到一起写入帧缓冲区;
渲染的过程就相当于管线,类似于生产流水线;
主要分为固定管线(类似于API,只是参数的不同)和可编程管线(GLSL语法来驱使GPU);
着色器是运行在GPU上的程序,它的主要用途是对三维物体进行着色处理,对光与影进行计算,以及控制纹理颜色的呈现等。从上面的渲染管线流程图可以看出在图形渲染过程中用到了多种着色器,包括顶点着色器、细分着色器、集合着色器、片元着色器等。其中顶点着色器和片元着色器是2个最基本的着色器。
顶点着色器是用于计算顶点属性的程序,主要包括顶点坐标转换、顶点关照运算等等。每个顶点都是单独运算的,也就是说每个顶点数据都会执行一次顶点着色器(并行执行)。
细分着色器由细分控制着色器)和细分赋值着色器完成。它会收到来自顶点着色器输出的数据,并对收到的数据进行进一步的处理,它会在OpenGL管线内部生成新的几何体。(这是一个可选阶段)
它会在OpenGL管线内部对所有几何图元进行修改,可以选择输入图元生成更多的几何体,改变几何图元的类型(比如将三角形转化成线段),或者放弃所有的几何体。(这是一个可选阶段)
片元着色器又叫像素着色器或片段着色器,主要用来处理图形中每个像素点(经过光栅化后得到的片元)的颜色计算和填充。每个像素点都会执行一次片元着色器。通常,片元着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色。
GLSL着色语⾔是⽤来在OpenGL中着⾊编程的语⾔,是在图形卡的GPU上执⾏的,代替了固定的渲染管线的⼀部分,使渲染管线中不同层次具有可编程性。
光栅化是将图元转化为一组二维片段的过程:当渲染一个图元时,光栅化(Rasterization)阶段通常会造成比原指定顶点更多的片段。它会根据每个片段在图元上所处相对位置决定这些片段的位置。基于这些位置,它会插值(Interpolate)所有片段着色器的输入变量;
包含了两部分的⼯作:一是决定窗⼝坐标中的哪些整型栅格区域被基本图元占⽤,二是分配一个颜⾊值和⼀个深度值到各个区域;
几何图元转化为二维图像,把物体的数学描述和相关的颜色信息转换为屏幕上对应位置的像素及填充像素颜色,将模拟信号转换为离散信号;
为了渲染出不同的透明度级别,需要开启混合;
可以理解为图层叠加的计算;
图形的平移 缩放 旋转变换 需要使用变换矩阵
用于将3D坐标变成二维屏幕的坐标 实际的线条也将在二维坐标中进行绘制
三、渲染流程
物体坐标/对象坐标——>模型变换——>世界坐标——>视变换——>观察者坐标/摄像机坐标——>投影变换——>裁剪变换——>透视除法——>规范化设备坐标——>视口变换——>屏幕坐标
顶点数据——>顶点着色器——>细分着色器——>几何着色器——>图元设置——>剪切——>光栅化——>片元着色器——>效果