OpenGL (Open Graphics Library)
一个跨平台编程语言,跨平台的编程图形程序接口,它将计算机的资源抽象为一个个OpenGL的对象,对这些资源的操作抽象为一个个的OpenGL指令
OpenGL ES (OpenGL for Embedded Systems)
OpenGL三维图形AP的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口。
DirectX
由很多API组成的,DirectX并不是一个单纯的图形API.最重要的是DirectX是属于windows上一个多媒体处理框架,并不支持windows以外的平台.所以不是跨平台框架.按照性质分类,可以分为四大部分,显示部分、声音部分、输入部分和网络部分.
Metal
Apple为游戏开发者推出了新的平台技术 Metal,该技术能够为3D图像提高10倍的渲染性能.Metal是Apple为了解决3D渲染而推出的框架
OpenGL与OpenGL ES的区别
- OpenGL 主要运用于PC端的图形图像渲染处理(MAC,windows)
- OpenGL ES 主要运用于移动端(iOS,Android)
OpenGL与OpenCV的区别
- OpenGL主要用于渲染(显示位图)
- OpenCV主要用于识别(人脸识别、身份识别、物体—>OpenCV face++)与人工智能结合
OpenGL ES与Metal的区别
- Apple 至2018年渲染部分例如CoreAnimation是基于OpenGL ES封装的上层框架,2018年后底层渲染迁移到了Metal
- OpenGL ES作为第三方库没法契合你项目定制化需求,没法迭代
- 很多的项目目前还是使用的OpenGL ES (跨平台,GLSL兼容iOS和Android)
- 替代原因:
4.1 不可能一直把非常重要的渲染核心框架使用第三方
4.2 调用GPU来进行运行(GPU并发运算,编码解码,识别,大量并发运算,2018年开始通过Metal提供的接口,让你调用GPU来自定义事情.借助Metal调度GPU来给你做运算)
图形API解决什么问题:--->渲染问题
- 系统针对按钮、图片、视图、图层渲染问题
- 游戏引擎->人物/场景渲染(图形API)
- 视频播放方框--->ijkplayer,kxmovie视频解码--->渲染(图形API)
- 核心动画--->动画操作(旋转、缩放、平移、图层特效)
- 视频/图片--->特效(图形API)
- 离屏渲染
OpenGL上下文[context]
在应用程序调用任何OpenGL的指令之前,需要安排首先创建一个OpenGL的上下文。这个上下文(环境)是一个非常庞大的状态机,保存了OpenGL中的各种状态,这也是OpenGL指令执行的基础
OpenGL 状态机
类推到OpenGL中来,可以这么理解:
OpenGL可以记录自己的状态(如当前所使用的颜色,是否开启了混合功能等)
OpenGL可以接收输入(当调用OpenGL函数的时候,实际上可以看成OpenGL在接收我们的输入),如果我们调用glColor3f,则OpenGL接收到这个输入后会修改自己的"当前颜色"这个状态
OpenGL可以进入停止状态,不再接收输入,在程序退出前,OpenGL总会先停止工作的
OpenGL 渲染
将图形/图像数据转换成2D空间图像操作叫做渲染(Rendering)
OpenGL 顶点数组(VertexArray)
将顶点数据存放在内存中
OpenGL 顶点缓冲区(VertexBuffer)
将顶点数据存放到GPU的显存中
png转换为位图(CoreGraphics)
位图: 120*120 = 14400 -->RGBA --->14400 *4 = 位图(纹理)
映射: 对应关系
OpenGL 管线:流水线
//工厂:肥皂 --->肥皂水--->模具--->肥皂块
固定管线
对应非常多的模具(固定着色器)--->结果
可编程管线
肥皂--->肥皂水--->自定义编程模具(GLSL语法来驱使GPU来进行代码实现)--->肥皂快(OpenGL ES GLSL)
着色器
函数/方法(代码段)--->CPU来使用;shader(代码段)--->GPU来使用
固定着色器(存储着色器)
苹果提供API(代码段)--->调用(参数)OpenGL来提供
自定义着色器
进行自定义(自己基于GLSL来进行编写代码段)
顶点着色器
用来处理顶点相关代码 (1.确定位置 2. 缩放/平移/旋转位置换算 3.手机端显示3D 手机屏幕实际2D,3D图形数据--->2D(投影换算)--->OpenGL ES)
片元着色器
片元(像素点)着色器,处理一个一个像素点;120*120 像素点.14400次 GPU并行运算;(例如图片进行饱和度调整--->片元着色器进行一个个像素点修改)--->OpenGL ES
GLSL(OpenGL Shading Language)
自定义着色器--->代码(语言) OpenGL 标准调用GPU来做计算
光栅化(Rasterization不可编程)
是把顶点数据转换为片元的过程,具有将图转化为一个个栅格做成的图像的作用,特点是每个元素对应帧缓冲区中的一个像素。
把物体的数学描述以及与物体相关的颜色信息转换为屏幕上用于对应位置的像素及用于填充像素的颜色,这个过程称为光栅化
离屏渲染shouldRa--->触发离屏渲染
第一个过程: 决定窗口坐标中的哪些整型栅格区域被基本图元占用
第二个过程: 分配一个颜色值和一个深度值到各个区域.、
纹理
纹理可以理解为图片,大家在渲染图形时需要在其编码填充图片,为了使得场景更加逼真,而这里使用的图片,就是常说的纹理,但是在OpenGL,我们更加习惯叫纹理,而不是图片
压缩图片--->位图 OpenGL .tga 纹理文件 OpenGL ES 移动端显示一张 png--->位图
混合
Layer2个图层--->粉红色0.5,蓝色0.2 = 叠加在一起 = 颜色混合行为--->离屏渲染 组透明度 --->OpenGL
变换矩阵(Transformation)
例如图形想发生平移、缩放、旋转变换。就需要使用变换矩阵
投影矩阵(Projection)
用于将3D坐标转换为二维屏幕坐标,实际线条也将在二维坐标下进行绘制
投影方式(观察者视角)
只有两种
1.正投影(平行投影)图片绘制不管远近1:1进行绘制,显示2D效果
2.透视投影 远小近大的效果,3D图形
摄像机坐标系
观察者坐标系
物体坐标系
物体本身的坐标系
世界坐标系
所有的物体都在世界坐标系范围内