OpenGL学习(一) 常见专业名词

370 阅读6分钟

先简单了解下OpenGL

计算机主要通过GPU来将图像显示到界面上,而OpenGL则提供了一组API,方便开发者调用来控制GPU,支持跨平台(Win/Mac/Linux),主要用于PC端

OpenGL ES

想要控制移动设备的GPU,就需要使用OpenGL API的子集,即OpenGL ES,相较于OpenGL,它去除了很多冗余的、性能低的接口

OpenCV

可与人工智能结合,主要用于识别,目前市面上主流的,如face++商业框架就是基于此

direct X

在Win上装过主机游戏的应该很眼熟,这就是Win上处理图像显示的框架,然而它不仅仅可以用来处理图像,更是用来处理输入、输出、显示、声音等多媒体的API框架

Metal

苹果自己开发,用于提供3D渲染的API,性能更高(2018年苹果宣布正式使用Metal代替OpenGL ES来进行界面渲染) Metal相较于OpenGL ES,除了性能更为出色外,更在OpenGL ES只支持处理图像的基础上,提供了一些定制化计算的支持

OpenGL在界面显示过程中扮演的角色

image.png

专业名词

视口

即程序的展示窗口

上下文(Context)

对于iOS开发者来说很常见(比如在用CoreGraphic来自定义绘制界面时),我们可能理解为是系统在绘制界面时的一些准备工作,或者是画布本身,其实可以理解为状态机,或者是用来保存某些状态的一个对象,它只负责记录某些功能是否打开,某些属性是true Or false

渲染

将图像显示到界面的过程,包括如何绘制界面及像素级地显示

顶点数组 重要!!!

在理解顶点数组之前,首先需要知道顶点是什么?

界面上显示的复杂图像,其实对于OpenGL ES而言,都可以分解为点、线、三角形这三类基本图元,而确定这些基本图元的点就是顶点 界面在渲染前都是先由顶点数据构成图形骨架,再在骨架基础上划定像素点范围,最后往各像素点填充颜色来完成的

而顶点数组就是存储顶点数据的容器,主要加载到内存中

顶点缓冲区

所有的顶点数据都加载到内存中,交给CPU处理势必影响显示性能,因此需要将部分顶点数据加载到GPU显存中缓冲,而存储这部分数据的容器就是顶点缓冲区

位图(纹理)

我们经常使用的png/jpg图片并不是直接显示到界面上的,也是要分解为一个个像素点去显示的 可以通过图片展示到界面上的流程来理解位图概念:

1.根据图片压缩方式的不同(png/jpg)解压图片,得到的就是位图(.tga格式)
比如解压一张120*120大小的图片,得到120*120=14400个像素点,每个像素点的颜色大小为4个字节(RGBA,每个字节8位,也就是我们平时赋值RGBA时的2^8=256->0~255),最后得到的位图大小即为14400*4个字节大小
2.接下来将位图映射到界面:即通过位图上各像素点与界面中各像素点的对应关系“进行覆盖”

管线

指完成渲染的流程(过程) 举个例子:工厂生产肥皂会有一条流水线,即 肥皂水->模具->肥皂块,而这个流水线就可以理解为管线

固定管线

系统提供对应的模具的管线就是固定管线

可编程管线

开发者自定义模具(通过GLSL语法来驱动GPU)的管线就是可编程管线

着色器(shader 也就是👆提到的模具)

我们日常使用的函数/方法,其实就是加载到CPU中的一个个代码块(OC/swift),相对于加载到内存中的代码块,加载到GPU中的就是着色器(shader),其实也是代码块(使用GLSL语法),顾名思义,作用在于控制像素点该显示什么颜色

固定(存储)着色器

OpenGL提供的固定代码块

自定义着色器

开发者利用GLSL语法编写的代码块 而OpenGL只提供两种自定义着色器:

顶点着色器

处理顶点数据的代码块,作用在于

1.确定顶点位置
2.计算缩放/平移/旋转等2D变换
3.计算3D投影变换
片元着色器

处理图形骨架范围内像素点的代码块,GPU会并行计算这部分代码,效率较高

GLSL(OpenGL Shader Language)

自定义着色器的代码语法,即使用符合OpenGL标准的语言调用GPU

光栅化

不可编程,光栅化是着色器渲染过程中重要的一步,也是将图形数据展示到屏幕上关键的一步

image.png

对应的流程图:

image.png

在图形骨架搭建结束后开始光栅化操作:

1.根据骨架确定像素范围(填充像素点)
2.使用片元着色器对各像素点开始着色

混合

即屏幕上两种颜色叠加的过程,我们都知道,屏幕的刷新频率是一秒钟60帧,即日常看到的60Hz,而每一帧展示的内容并不是要等到即将展示到屏幕上时才创建,而是会有对应的帧缓冲区存储事先构造好的帧画面,而混合就是将屏幕上的像素颜色与帧缓冲区的颜色通过OpenGL提供的混合算法进行换算,展示新的颜色(当然也可以自定义混合算法)

矩阵

想必大家都学过线性代数,当时觉得派不上用场,没想到这里就用到啦~顶点数据通过矩阵变换就可以得到我们想要的效果

变换矩阵

想要进行平移/缩放/旋转变换,就需要使用变换矩阵

投影矩阵

可以将顶点数据从3D坐标转换为二维屏幕坐标

投影方式

正投影

1:1显示2D效果

透视投影

远小近大 真实模拟肉眼所见的3D效果

image.png

图中的Camera可以理解成观察者视角

接下来简单介绍下OpenGL中的坐标系

image.png

通过各种坐标系转换及矩阵变换就可以将任何一个物体的坐标转换到屏幕中

image.png

而在此转换过程中我们可以通过代码干预(自定义)的只能是在裁剪坐标转换之前的步骤

写在最后:虽然开发iOS很多年,可感觉技术在很久之前就已经停滞不前,这也是第一次自己狠下心来写博客,如有不周,还望各位大佬指正,谢谢!