这是我参与「第四届青训营 」笔记创作活动的第19天
基础知识
- OpenGL(Open Graphics Library)
- ⼀个跨编程语⾔、跨平台的编程图形程序接⼝,它将计算机的资源抽象称为⼀个 OpenGL 的对象,对这些资源的操作抽象为⼀个的 OpenGL 指令
- OpenGL ES (OpenGL for Embedded Systems)
- OpenGL三维图形 API 的⼦集,针对手机、 PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接⼝
- DirectX
- DirectX 是 Windows 上⼀个多媒体处理API,并不支持 Windows 以外的平台,所以不是跨平台框架。DirectX 不是⼀个单纯的图形API,按照性质分类,可以分为四⼤部分:显示部分、声⾳部分、输入部分和⽹络部分
- Metal
- Apple 为游戏开发者推出了新的平台技术,该技术能够为 3D 图像提⾼ 10 倍的渲染性能。Metal 是 Apple 为了解决 3D 渲染而推出的框架
OpenGL 状态机
- 状态机可以理解为一台可以保存状态,并根据当前状态进行相应输出的机器
- 当进⼊特殊状态(停机状态)时,不再接收输⼊,停⽌工作
渲染管线 Render Pipeline
在 OpenGL下渲染图形,就像一个固定顺序的流⽔线,任务严格按照既定的先后顺序依次执行
Pipeline 也有“流水线”的意思,但目前常见翻译为“管线”
OpenGL 上下文(context)
-
非常庞大的状态机
- 在应⽤程序调⽤任何 OpenGL 的指令之前,首先需要创建⼀个 OpenGL 的上下⽂。这个上下⽂是⼀个⾮常庞⼤的状态机,保存了 OpenGL 中的各种状态,这也是 OpenGL 指令执⾏的基础
-
面向过程,可封装为面向对象
- OpenGL 的函数不管在哪个语⾔中,都是类似C语⾔一样的面向过程的函数。本质上都是对 OpenGL 上下⽂这个庞⼤的状态机中的某个状态或者对象进行操作。通过对 OpenGL 指令的封装,可以将 OpenGL 的相关调⽤封装成为⼀个⾯向对象的图形API
-
切换上下文开销大,可创建多个上下文独立使用
- 由于 OpenGL 上下⽂是⼀个巨大的状态机,切换上下文往往会产生较⼤的开销,但是不同的绘制模块,可能需要使⽤完全独立的状态管理。因此,可以分别创建多个不同的上下文,在不同线程中使⽤不同的上下文,上下⽂之间共享纹理、缓冲区等资源。⽐反复切换上下⽂,或者⼤量修改渲染状态,更加合理高效
GPUImage
- 成熟的三方框架,可以用于学习原理
- GPUImage 已经停止维护了,但不妨碍学习
- 也可以看 GPUImage2 或 GPUImage3 进行学习
使用非常简单
- 准备最终渲染的视图
- 初始化视频播放类和滤镜类
- 将视频、滤镜、渲染视图串联起来