二、OpenGL专业名词解析

2020-07-03  本文已影响0人  东篱采桑人
1.OpenGL上下文

在应用程序调用任何OpenGL的指令前,都需要先创建一个OpenGL的上下文。这个上下文是一个非常庞大的状态机,保存了OpenGL中的各种状态,这也是OpenGL指令执行的基础。

OpenGL的函数是类似C语言一样的面向过程的函数,本质上都是对OpenGL上下文这个庞大状态机中某个状态或对象进行操作。也可以通过对OpenGL的封装,将OpenGL相关指令封装成一个面向对象的图形API

OpenGL上下文是一个非常庞大的状态机,切换上下文往往会产生较大的开销。当遇到不同的绘制模块,需要使用完全独立的状态管理时,可以在应用程序中创建多个上下文,在各线程中分别使用不同的上下文,上下文之间共享纹理、缓存区等资源。这样会比反复切换上下文,或者大量修改渲染状态,更加合理和高效。

2.OpenGL状态机

状态机理论上是一种机器,它记录了一个对象在其生命周期中所经历的各种状态,并能响应状态转变事件来进行对应的输出。具有如下特点:

前面有提到过OpenGL上下文是一个庞大的状态机,它对OpenGL指令的响应可以这么理解:

3.渲染(Rendering)

将图形/图像数据转换成2D空间图像的操作叫做渲染。

4.顶点数组( VertexArray )和顶点缓存区( VertexBuffer )

画图时一般先画好图像的骨架,然后往骨架里填充颜色。OpenGL也是一样,先通过顶点数据确定图像的轮廓(比如三角形的三个顶点),但需要注意的是,OpenGL中的图像都是由图元组成。在OpenGL ES中,有三种类型的图元:线三角形

5.管线

在工厂中,将不同的零件按照指定顺序组装成最后的产品,这个过程称之为流水线作业。
OpenGL下渲染图形,也会按顺序经历一个一个节点,这样的操作过程称为管线管线是一个抽象概念,之所以这么称呼,是因显卡按照一个固定的顺序来处理数据,就像水从水管的一端流向另一端,这个顺序是不能被打破的,所以就形象地称为管线

6.固定管线

在早期的OpenGL版本,封装了很多种着色器程序块,提供了一段包含光照、坐标转换、裁剪等诸多功能的固定shader程序块,开发者只要传入相应的参数,即可快速完成图形的渲染。这种程序块,称为固定管线。类似于iOS开发会封装很多API,⽽我们只需要调⽤,就可以实现功能,不需要关注底层实现原理。

但是由于OpenGL的使用场景非常丰富,固定管线或存储着色器无法完成每一个业务,所以需要将相关部分开放成可编程。

7.着色器程序Shader

Shader,中文名着色器,是专门用来渲染图形的一种技术,它的本质是一段程序代码,这段代码的作用是告诉GPU具体怎么绘制图形的每个顶点及最终的每个像素的颜色。
通过Shader,我们可以自定义显卡渲染画面的算法,将固定渲染管线架构变为了可编程渲染管线,使画面达到我们想要的效果。

常见的Shader主要有顶点着⾊器(VertexShader),⽚段(元)着⾊器 (FragmentShader)/像素着⾊器(PixelShader),⼏何着⾊器 (GeometryShader),曲⾯细分着⾊器(TessellationShader)。
直到OpenGL ES 3.0,依然只支持顶点着色器片段着色器

7.1顶点着色器(VertexShader)
7.2⽚段着⾊器(FragmentShader)

OpenGL进⾏绘制的时候,⾸先由顶点着⾊器对传⼊的顶点数据进⾏运算,再通过图元装配,得出构成这个图形所需的所有图元。然后进⾏光栅化,将图元这种⽮量图形,转换为栅格化数据。最后,将栅格化数据传⼊⽚段着⾊器中进⾏运算。⽚段着⾊器会对栅格化数据中的每⼀个像素进⾏运算,并决定像素的颜⾊。

8.GLSL (OpenGL Shading Language)

OpenGL着⾊语⾔,是⽤在OpenGL中着⾊编程的语⾔,也即开发⼈员写的短⼩的⾃定义程序,他们是在图形卡的GPU 上执⾏的,代替了固定的渲染管线的⼀部分,使渲染管线中不同层次具有可编程性。⽐如:视图转换、投影转换等。GLSL的着⾊器代码分成2个部分: VertexShader(顶点着⾊器)和FragmentShader(⽚元着⾊器)。

9.光栅化(Rasterization)

光栅化是一个将几何图元转变成二维图像的过程。二维图像上每个点都包含颜色、深度、纹理等数据,这个点和相关数据被称为片段/元(Fragment)

下面以OpenGL绘制一个正方形来介绍光栅化的工作:

10.纹理

纹理是用来表现物体表面细节的一幅或几幅二维图形,也称纹理贴图。在渲染图形时,为了使场景更加逼真,有时候需要在图形上映射纹理贴图。瓷砖上凹凸的花纹,以及瓷器上的图案,都可以理解成纹理。

11.混合(Blending)

混合是将一种颜色和另一种颜色组合以获得第三种颜色的行为。在OpenGL中,混合发生在渲染过程的后期:片段着色器计算出片段的最终输出颜色并写入帧缓冲区时,通常情况下,这片段会覆盖之前所有内容,但如果启用了混合,那么该片段将与之前的片段颜色进行混合。

混合的算法可以通过OpenGL的函数进⾏指定,但是OpenGL提供的混合算法是有限的,如果需要更加复杂的混合算法,⼀般可以通过片段着⾊器进⾏实现,当然性能会⽐原⽣的混合算法差⼀些。

12.变换矩阵(Transformation)

例如图形想发⽣平移,缩放,旋转变换,就需要使⽤变换矩阵。

13.投影矩阵(Projection)

⽤于将3D坐标转换为⼆维屏幕坐标,实际线条也将在⼆维坐标下进⾏绘制。投影方式有两种:

14.渲染上屏/交换缓冲区(SwapBuffer)
上一篇 下一篇

猜你喜欢

热点阅读