OpenGL ES

iOS音视频:OpenGL常用术语介绍

2021-03-20  本文已影响0人  iOS开发之家

1. 前言

iOS音视频】是个系列,里面会记录一些博主在iOS音视频方面的学习笔记、踩到的坑,以便温故而知新。

此系列文章包括但不限于:

  1. iOS音视频:OpenGL常用术语介绍
  2. ...

本文是这个系列的第1篇文章,主要目的是帮助大家快速了解OpenGL,下面进入正文。

2. OpenGL简介

2.1 OpenGL是什么

OpenGL(Open Graphics Library,译为 开放图形库开放式图形库):是用于 渲染 2D、3D矢量图形的跨语言、跨平台的应用程序编程接口库。

它是一种图形API库,它把计算机的资源抽象成一个个OpenGL对象,对这些资源的操作抽象成一个个OpenGL指令。由于它只提供渲染功能(操作的是GPU芯片),与窗口系统、音频、打印、键盘/鼠标或其他输入设备无关,所以具备跨平台性(主要运行在PC端,如Mac OS、Linux、Windows等)。

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:834688868,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

以下资料在群文件可自行下载

与OpenGL类似的图形API库还有OpenGL ESMetalDirectX等,它们之间的主要区别是:

由于博主主要从事iOS开发,所以DirectX在此系列文章中将不做赘述。

2.2 OpenGL解决什么问题

作为图形API库,OpenGLOpenGL ESMetal在任何项目中解决问题的本质就是利用GPU芯片来高效渲染图形图像。使用这些图形API库也是iOS开发者唯一接近GPU的方式。

因此,图形API库常常被用在下述场景中:

2.3 关于选择的问题

苹果于WWDC 2014上提出Metal,但直到WWDC 2018年,苹果才完成系统内部从OpenGL ESMetal的过渡,同时宣布在苹果设备上(macOS MojaveiOS 12tvOS 12)弃用OpenGL/OpenGL ES/OpenCL。从事图形API工作的开发者需要从自身角度考虑由哪个入门,可以从下面几方面综合考虑:

所谓艺多不压身,沿着 OpenGL -> OpenGL ES -> Metal 的路线全部掌握也不失为一种选择。

3. OpenGL常用术语介绍

3.1 OpenGL状态机

状态机是理论上的一种机器,它描述了一个对象在其生命周期内所经历的各种状态,状态间的转变,发生转变的原因、条件及转变中所执行的活动。或者说,状态机是一种行为,说明对象在其生命周期中响应事件所经历的状态序列以及对那些状态事件的响应。因此具有以下特点:

OpenGL本身就是一个庞大的状态机,它同样:

需要注意的是,它每一次状态改变都是全局的,因此在完成某状态下的功能后,需要把状态关闭/切换回去。

如可以使用glColor函数来选择一种颜色,以后绘制的所有物体都是这种颜色,除非再次使用glColor函数重新设定;同理,可以使用glTexCoord函数来设置一个纹理坐标,以后绘制的所有物体都是采用这种纹理坐标,除非再次使用glTexCoord函数重新设置。

总的来说,OpenGL是一个状态机,它保持自身的状态,除非用户输入一条指令让它改变状态。

例如:

// 获取是否深度测试/混合
glIsEnabled(GL_DEPTH_TEST);
glIsEnabled(GL_BLEND);

// 开启/关闭深度测试
glEnable(GL_DEPTH_TEST);
glDisable(GL_DEPTH_TEST);

// 开启/关闭混合
glEnable(GL_BLEND);
glDisable(GL_BLEND);
复制代码

3.2 OpenGL上下文

OpenGL是面向过程的,它在渲染的时候需要一个Context来记录渲染需要的所有信息和状态,也就是OpenGL上下文。应用程序在调用任何OpenGL的指令之前,都需要首先创建一个OpenGL上下文

3.3 图元

图元(Primitive),是基本图形元素的简称,在OpenGL/OpenGL ES中,任何图像都是由图元组成。

3.4 顶点数组和顶点缓冲区

在绘制图像时,图像的顶点位置数据就是顶点数据

在调⽤OpenGL绘制方法时,

3.5 渲染(Rendering)

OpenGL中,任何事物都是处于3D空间的,而屏幕/窗口显示的是2D。将原始图形/图像数据转换成3D空间图像,并最终显示在2D屏幕/窗口,这个操作就是渲染(Rendering)。

渲染主要有两大流程,分别是:

3.6 管线

图形渲染管线(Graphics Pipeline),简称管线,描述的是渲染图形的过程。渲染图形并非是一蹴而就的,它的整个过程又会经历一个个阶段,类似于工厂的流水线作业。

管线是个抽象的概念,之所以称之为管线是因为显卡在处理数据的时候是按照一个固定的顺序来的,⽽且严格按照这个顺序(就像⽔从一根管⼦的⼀端流到另⼀端,这个顺序是不能打破的)。

管线可以分为几个阶段,每个阶段将会把前一个阶段的输出作为输入。所有这些阶段都是高度专门化的(它们都有一个特定的函数),并且很容易并行执行。

管线可分为 固定管线可编程管线

3.7 着色器

着色器(Shader)是运行在GPU上的程序,用于实现实现渲染的,这些小程序为管线的某个特定部分而运行(把输入转化为输出)。OpenGL在实际调⽤绘制函数之前,还需要指定⼀个着⾊器程序。

3.7.1 顶点着色器

顶点着色器(Vertex Shader)是用来操作顶点数据的(旋转、平移、投影等)。顶点着色器是逐顶点运算的程序,也就是说每个顶点数据都会执行⼀次顶点着⾊器,当然这是并行的,并且顶点着⾊器运算过程中⽆法访问其他顶点的数据

3.7.2 片元着色器

片元着色器(Fragment Shader)是用于计算每个像素填充颜色的程序。它是逐像素运算的程序,即每个像素都会执行一次片元着色器,当然这也是并行的、独立的。

思考:为什么OpenGL使用GPU而不是CPU

有的书籍把片元着色器叫做像素着色器(Pixel Shader),或者片段着色器,开发者只需要知道这3者是同一个东西即可(只是叫法不同,另外,片元着色器Metal里叫做片元函数)。

3.7.3 GLSL

GLSL(OpenGL Shading Language)是编写着色器的语言,这是一种类C的语言。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。

3.7.4 着色器的渲染流程

着色器也是会经过编译、链接等步骤,并最终生成着色器程序(glProgram)的,它必定同时包含顶点着色器片元着色器的运算逻辑,其他着色器则是可选的(如细分着色器)。

简单介绍一下着色器的渲染流程,大致如下图所示:

image

说明:

  1. OpenGL进行渲染的时候,首先由顶点着色器对顶点数据进行运算,再经过图元装配,将顶点转化为图元
  2. 接着就是光栅化处理,图元数据由此转换为栅格化数据
  3. 最后,栅格化数据经由片元着色器运算(逐像素,并决定像素的填充色),渲染成型。

注意:这里只是个大致的流程(以着色器的视角)。

3.8 光栅化

光栅化(Rasterization)是把顶点数据转换为片元的过程,具有将图转化为一个个栅格组成的图象的作用,特点是每个元素对应帧缓冲区中的一像素。

3.9 纹理

纹理可以理解为图片(实质上是位图),图像渲染时经常需要填充图片。这里的图片其实就是纹理,在OpenGL中,我们更喜欢称之为纹理

3.10 混合

混合(Blending)是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式(混合算法)混在一起,从而实现特殊的效果。简单理解就是把两种/多种颜色混合在一起。

3.11 矩阵

OpenGL中,矩阵常常被用来进行辅助运算,如:

等。

3.12 帧缓存

帧缓冲存储器(Frame Buffer),简称帧缓存显存,它是接收渲染结果的缓冲区,为GPU指定存储渲染结果的区域。

关于帧缓存,说明如下:

缓冲区(Buffer)这个中文译意源自当计算机的高速部件与低速部件通讯时,必须将高速部件的输出暂存到某处,以保证高速部件与低速部件相吻合。后来这个意思被扩展了,成为“临时存贮区”的意思。

4. 思考:

4.1 Why GPU?

思考:为什么OpenGL使用GPU而不是CPU

解析:解答这个问题要理解GPU(中央处理器)和CPU(图形处理器)的区别。首先看一下这两者的设计,大致如下:

image image

图片来自 Nvidia CUDA 文档,其中绿色的是计算单元,橙红色的是存储单元,黄色的是控制单元。

从图中不难看出,

此外,CPU虽然号称多核,但总数没有超过两位数;而GPU的核数远超GPU,被称为众核。

总的来说,CPU擅长逻辑控制以及串行的运算,而GPU则擅长大规模的并发计算。在OpenGL渲染图形图像的时候,往往伴随着海量的计算(如对每一个顶点进行同样的坐标变换,对每一个片元计算颜色值等等),因此,OpenGL使用GPU而不是CPU

5. 友情链接


作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:834688868,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

如果觉得本文对你有帮助,请给我点个赞吧~

PS:转载请注明出处,谢谢!

作者:红酒牛排
链接:https://juejin.cn/post/6940900616881307679
来源:掘金

上一篇下一篇

猜你喜欢

热点阅读