OpenGL 常见专业名词
书籍推荐
红宝书:OpenGL编程指南
蓝宝书:OpenGL超级宝典
图形API简介
- OpenGL PC端 图形图像渲染处理
- OpenGL ES 移动端/嵌入式 图形图像渲染处理,OpenGL 子集
- DirectX Windows 平台专有多媒体处理框架,且不单是渲染功能,包括:显示、声音、输入、网络四个部分
- Metal Apple 专有渲染框架(跨平台还在计划中)
OpenGL vs OpenCV
OpenGL vs Metal
- 2018年,Apple CoreAnimation 底层从 OpenGL 改为 Metal
- OpenGL ES 优势:跨平台、使用GLSL可自定义程度高,
- Metal 增加了调用 GPU 来进行运算的 API,如 GPU 并发运算、编码解码、识别等,而OpenGL ES 仅提供了调用 GPU 进行渲染的 API
Apple 渲染API架构
图形 API 用来解决业务中的渲染问题
- 系统针对图片、视图、图层渲染嗯仝
- 游戏引擎中的人物/场景渲染
- 视频播放框架 ijkplayer、kxmovie 的视频解码->渲染
- iOS 核心动画:旋转、缩放、移动、图层特效
- 视频/图片 增加特效
- 从图形 API 的角度理解离屏渲染
OpenGL 上下文
- 在调用 OpenGL 的指令之前,都要创建一个上下文。上下文是一个状态机,保存了 OpenGL 中的各种状态。
- 把对上下文状态或对象的操作进行封装,可以得到一个面向对象的图形 API
- 上下文是一个巨大的状态机,切换开销较大(渲染状态、资源、缓冲区等内容需要修改),因此,可以在程序中创建多个上下文,在不同线程使用。多个上下文可以共享纹理、缓冲区等资源,不会增加很多资源开销。
OpenGL 状态机
- 记录 OpenGL 的各种状态。
- 可以接收参数,结合之前的各种状态,修改对应的一些状态,并可以有对应输出。
- 可以输出当前的各种状态。
- 状态机停机的时候,不在接收输入。
- 跟配置文件相比,后者是静态的修改对应参数,而状态机是有逻辑处理的,会结合其他的状态值修改一个或多个状态。
OpenGL 渲染[Rendering]
将图形/图像数据转换成2D空间图像的操作
顶点数组[VertexArray]和顶点缓冲区[VertexBuffer]
- 顶点数组:顶点数据 -> 内存中
- 顶点缓冲区:内存中的顶点数据 -> GPU 显存
位图(纹理)
一张 120*120 的位图 = 14400 像素
每个像素点存储 RGBA 四个值,14400 * 4 = 57600, 这就是位图的大小
下图体现了RGB图像RGB三通道,未包含Alpha通道信息
管线
即流水线,是指将指令处理过程拆分为多个步骤执行。其具体执行过程类似工厂中的流水线,并因此得名。
-
固定管线
固定的管线,即固定的处理步骤。
在 OpenGL 有固定着色器发挥固定管线的作用。 -
可编程管线
可自定义管线。
在 OpenGL 中使用 GLSL 语法来驱使 GPU,自定义处理过程。
着色器(shader)
调用 GPU 执行的代码段
-
固定着色器(存储着色器)
底层提供的不可修改的着色器,调用 OpenGL 操作 GPU -
自定义着色器
基于 GLSL 语法进行编写的代码段(着色器)。
以下两种是可自定义的着色器。-
顶点着色器
用来处理顶点相关的代码- 确定图形位置
- 缩放/平移/旋转
- 3D图形->2D图形 (投影换算)
-
片元着色器(像素着色器)
片元即像素点。
120*120 的图片有 14400 个像素点,处理一次需要进行 14400 次操作,GPU 使用并行运算,相较于 CPU 的串行运算效率高。
-
GLSL
自定义着色器使用的编程语言。
光栅化
光栅化就是把顶点数据转换为片元的过程。片元中的每一个元素对应于帧缓冲区中的一个像素。
光栅化其实是一种将几何图元变为二维图像的过程。该过程包含了两部分的工作。
- 决定窗口坐标中的哪些整型栅格区域被基本图元占用;
- 分配一个颜色值和一个深度值到各个区域。光栅化过程产生的是片元。
纹理(位图)
需要将 jpg/png 等压缩图片转为位图,交给 OpenGL 使用
混合
OpenGL 进行图层叠加像素点的颜色混合操作
变换矩阵
图形进行平移、缩放、旋转变换,使用变换矩阵,修改顶点坐标。
投影矩阵
将 3D 坐标转换为 2D 坐标,使用的计算矩阵。
坐标系
2D 笛卡尔坐标系、3D 笛卡尔坐标系
视口
坐标系对应屏幕区域
投影方式
- 正投影(平行投影),1:1 进行绘制,显示2D效果
- 透射投影 远小近大,3D图形
OpenGL 中的坐标系
摄像机坐标系:观察者视角坐标系
世界坐标系:全部内容所在的坐标系
惯性坐标系:以物体作为原点,对世界坐标系进行平移的坐标系
物体坐标系:物体本身的坐标系
着色器渲染流程
顶点数据 -> 顶点着色器 -> 细分着色器 -> 几何着色器 -> 图元设置 -> 剪切 -> 光栅化 -> 片元着色器 -> 效果
开发者可以操作 顶点着色器 和 片元着色器