OpenGL
是一个跨编程语言、跨平台的编程图形程序接口OpenGL ES
是 OpenGL
三维图形API的自己,针对 手机、PDA和游戏主机
等嵌入式设备而设计的,去除了很多不必要觉和性能较低的API接口DirectX
是由很多API组成的, DirectX
并不是一个单纯的图形API。最重要的是 DirectX
是属于Windows上一个多媒体处理框架,并不支持Windows以外的平台Metal
是Apple为游戏开发者退出的新的平台技术,该技术能为3D图像提高10倍的渲染性能
简单来说就是 实现图形的底层渲染
OpenGL/OpenGL ES/Metal 在任何项目中解决问题的本质——利用 GPU芯片
来高效渲染图形图像
图形API是iOS开发者唯一接近GPU的方式
Context
OpenGL状态机
描述了一个对象的生命周期经历各种状态发生转变时的动因、条件及转变中所执行的活动
渲染
:将图形/图像数据转换成3D空间图像的操作叫做渲染(Rendering)即 数据->可视化界面
的过程,也就是我们口中所说的 绘制
顶点数组
(VertexArray)和 顶点缓冲区
(VertexBuffer):
管线
:可以理解为流水线。在OpenGL下渲染图形,就会经历一个一个节点,这样的操作可以理解为管线。之所以称为管线是因为显卡在处理数据的时候是按照一个固定的顺序来的固定管线/存储着色器
:在早期OpenGL版本中,开发者只需要传入相应的参数,就能快速完成图形的渲染。开发者只需要调用API使用封装好的固定shader程序段,并不需要关注底层实现原理着色器程序Shader
是一段程序代码,是用来操作GPU进行计算的,主要的着色器有:
顶点着色器
对传入的顶点数据进行运算,将顶点转换为图元;然后进行 光栅化
转化为栅格化数据;最后传入 片元着色器
进行运算顶点着色器
(VertexShader)
片元着色器
(FragmentShader)
GLSL
(OpenGL Shading Language)
顶点着色器
和 片元着色器
光栅化
(Rasterization)
几何图元变为二维图像
的过程。该过程包含了两部分工作:决定窗口坐标中的那些整形栅格区域被基本图元占用;分配一个颜色值和一个深度值到各个区域纹理
:即图片(位图)混合
:两种颜色的视图叠在一起后的颜色就叫混合变换矩阵
(Transformation):图形发生平移、缩放、旋转变换投影矩阵
(Projection):将3D坐标转换为二维屏幕坐标渲染上屏/交换缓冲区
(SwapBuffer)
垂直同步信号
,这个技术成为 垂直同步
MVP矩阵:Model、View、Projection
常用坐标系的比较
物体坐标系
和 世界坐标系
转换过程中的一个中转站,为了方便物体坐标系转换到世界坐标系
坐标系对应的空间系
物体坐标/对象坐标->(模型变换)->世界坐标->(视觉变换)->观察者坐标/摄像机坐标->(投影变换)->裁剪坐标->(透视除法)->规范化设备坐标->(视口变化)->屏幕坐标
这个过程中以下过程是可以开发者定义的:
顶点着色器
处理顶点数据细分着色器
描述物体的形状(OpenGL3.0已经不开放细分着色器的API)几何着色器
决定输出的图元类型和个数(不需要关心细节)图元设置
明确图元的类型,是三条线还是三角形(三个顶点并一定是三角形)光栅化
几何图元转为二维图像(像素点)片元着色器
填充像素点的颜色、深度值等
具体请见iOS中图片的解压缩到渲染过程
+imageWithContentOfFile:
从磁盘中加载一张图片并不会解压缩图片CATransaction
捕获到了 UIImageView
图层数的变化Runloop
到来时, Core Animation
提交了这个隐式的 transaction
CGBitmapContextCreate
对图片进行重新绘制,得到一张新的解压缩后的位图