一、OpenGL 名词解析

246 阅读5分钟

OpenGL 常见专业名词

书籍推荐

红宝书:OpenGL编程指南
蓝宝书:OpenGL超级宝典

图形API简介

  • OpenGL PC端 图形图像渲染处理
  • OpenGL ES 移动端/嵌入式 图形图像渲染处理,OpenGL 子集
  • DirectX Windows 平台专有多媒体处理框架,且不单是渲染功能,包括:显示、声音、输入、网络四个部分
  • Metal Apple 专有渲染框架(跨平台还在计划中

OpenGL vs OpenCV

  • OpenGL 渲染:显示->位图
  • OpenCV 识别(人脸、身份、物体等,如Face++),常用在人工智能领域

OpenGL vs Metal

  • 2018年,Apple CoreAnimation 底层从 OpenGL 改为 Metal
  • OpenGL ES 优势:跨平台、使用GLSL可自定义程度高,
  • Metal 增加了调用 GPU 来进行运算的 API,如 GPU 并发运算、编码解码、识别等,而OpenGL ES 仅提供了调用 GPU 进行渲染的 API

Apple 渲染API架构

图形 API 用来解决业务中的渲染问题

  • 系统针对图片、视图、图层渲染嗯仝
  • 游戏引擎中的人物/场景渲染
  • 视频播放框架 ijkplayerkxmovie 的视频解码->渲染
  • 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 语法进行编写的代码段(着色器)。
    以下两种是可自定义的着色器。

    • 顶点着色器
      用来处理顶点相关的代码

      1. 确定图形位置
      2. 缩放/平移/旋转
      3. 3D图形->2D图形 (投影换算)
    • 片元着色器(像素着色器)
      片元即像素点。
      120*120 的图片有 14400 个像素点,处理一次需要进行 14400 次操作,GPU 使用并行运算,相较于 CPU 的串行运算效率高。

GLSL

自定义着色器使用的编程语言。

光栅化

光栅化就是把顶点数据转换为片元的过程。片元中的每一个元素对应于帧缓冲区中的一个像素。
光栅化其实是一种将几何图元变为二维图像的过程。该过程包含了两部分的工作。

  1. 决定窗口坐标中的哪些整型栅格区域被基本图元占用;
  2. 分配一个颜色值和一个深度值到各个区域。光栅化过程产生的是片元。

纹理(位图)

需要将 jpg/png 等压缩图片转为位图,交给 OpenGL 使用

混合

OpenGL 进行图层叠加像素点的颜色混合操作

变换矩阵

图形进行平移、缩放、旋转变换,使用变换矩阵,修改顶点坐标。

投影矩阵

将 3D 坐标转换为 2D 坐标,使用的计算矩阵。

坐标系

2D 笛卡尔坐标系、3D 笛卡尔坐标系

视口

坐标系对应屏幕区域

投影方式

  1. 正投影(平行投影),1:1 进行绘制,显示2D效果
  2. 透射投影 远小近大,3D图形

OpenGL 中的坐标系

摄像机坐标系:观察者视角坐标系
世界坐标系:全部内容所在的坐标系
惯性坐标系:以物体作为原点,对世界坐标系进行平移的坐标系
物体坐标系:物体本身的坐标系

着色器渲染流程

顶点数据 -> 顶点着色器 -> 细分着色器 -> 几何着色器 -> 图元设置 -> 剪切 -> 光栅化 -> 片元着色器 -> 效果

开发者可以操作 顶点着色器 和 片元着色器