OpenGL专业名词解析
前言
OpenGL是一套用于渲染2D、3D图形、调用GPU功能的API,可以用于视频/图片的处理、游戏引擎开发、AR、VR等方面,它是一种可以对图形硬件设备特性进行访问的软件库。
OpenGL没有窗口系统,与硬件无关,所以可以在不同的硬件系统上完全通过软件的方式实现OpenGL接口,是一种跨平台的API。
其他图形库
OpenGL ES:是OpenGL的一个子集,主要针对嵌入式设备使用。
DirectX:属于Windows系统的一套多媒体处理库,除了用于渲染的显示部分,还包括声⾳音部分、输⼊部分和网络部分,并不是一个和OpenGL一样纯粹渲染的库。
Metal:WWDC 2014苹果推出的新的渲染应用程序的API,和OpenGL和类似,目前应用于iOS系统。
本文将对OpenGL的常见专业名词做解析,方便后面学习时理解和阅读文档。
上下文(Context)
OpenGL本身就是一个非常庞大的状态机,其状态通常被称为OpenGL上下文,上下文中包存了如颜色、宽度等一系列变量来描述OpenGL此刻如何运行。我们调用OpenGL指令时,会先创建一个OpenGL上下文,通过对上下文中的某个状态进行操作,改变最终呈现的效果。OpenGL的API是面向过程的,其函数本质上都是对OpenGL上下文的某个状态进行操作的。应用程序可以创建多个不同的上下文,他们分别在各自的线程中使用,共享纹理、缓冲区等资源。
可以将上下文理解为一只画笔(或者说绘画工具),通过修改这只画笔的颜色、粗细,来修改图形的显示结果。
渲染(Render)
渲染即把数据显示绘制到屏幕的过程,比如我们拿到一张png格式的图片,解码成二进制数据即位图后,需要交给GPU进行计算展示到屏幕上,而位图数据展示到屏幕上的这一过程就称为渲染。
顶点数组(VertexArray)
Open绘制图形很类似我们平时绘画的,我们需要先确定待绘图的顶点位置,才能由点到线在由线到面,比如画三角形时先确定三个顶点位置,而保存顶点的位置数据(通常是(x,y,z))的数组称为顶点数组。
顶点缓存区(VertexBuffer)
顶点数组是保存在内存中的,而渲染是在GPU上进行的,CPU的数据交到GPU上需要经过数据总线,效率可能会比较低,所以我们将顶点数据传到GPU的显存中,提高运行的效率。
光栅化(Rasterization)
光栅化是指将顶点数据转化为片元的过程,即将一个几何图形转化为一个个栅格填充的图像的过程,如下图:
15936727270534.jpg
光栅化包括两个过程,一个是决定那些栅格区那些被片元占有,一个是分配一个颜色值和深度值到各个片元中,其实就是将几何信息转换成一个个的栅格组成的图像的过程。
纹理(Texture)
在我们实际开发中可以理解为图片,在我们光栅化后需要将一个图片数据显示到指定区域中,这张图片我们称之为纹理。
OpenGL中的图片并不是我们平时理解的png格式的图片,而是解码后生产的包含RGBA数据的位图(tga文件)
混合(Blending)
混合是指将两个或两个以上图元,以某种混合生成另一种效果的过程,通常使用在透明或半透明的图元中。这个很好理解,比如我们熟知的红绿蓝三基色可以按照不同比例混合成不同的颜色。
需要注意的是,混合只能在RGBA模式下进行。
着色器(Shader)
着色器可以理解为一段供GPU调用代码段,我们将参数和数据输入到着色器中,着色器即计算这些数据得到对应的结果供GPU使用。比如输入顶点数据,让着色器计算像素点的位置。
OpenGL2.0后着色器可以分为两大类,即固定着色器和自定义着色器。
固定着色器包括单元着色器、平面着色器等。
自定义着色器:目前只有顶点着色器和片元着色器。
顶点着色器:用来处理顶点相关代码,如确定位置,平移,旋转等。
片元着色器:或称像素着色器,用来处理一个个像素点,比如添加蒙层、滤镜。
管线
管线指的是我们将一系列数据转化到最终渲染出图像的过程,可以理解为一条流水线,我们提供原材料(数据),经过流水线后,得到最终的产品(图像)。
OpenGL2.0后,我们可以通过GLSL编写自定义着色器得到不同的图像,而使用了自定义着色的管线,我们称为可编程管线,否则称为固定管线。
投影
顾名思义是指3D物品呈现成2D图像,OpenGL有正投影和透视投影两种。
投影矩阵和变换矩阵
OpenGL可以绘制3D图形,但是显示界面是2D平面,所以我们要将3D的物品投影到2D平面上,这时候我么就需要投影矩阵与物体的三维坐标进行运算得到二维坐标。
同样的图形发生平移也涉及到了顶点位置的变化,也需要一个矩阵进行运算得到正确坐标,这个矩阵称为变换坐标。
GLSL
OpenGL Shading Language的简称,OpenGL的着色语言,可以用来编写自定义着色器。