OpenGL

第一节—OpenGL中的专业名词解析

2019-05-23  本文已影响0人  L_Ares

本文借鉴并引用的内容来自:
《OpenGL超级宝典 第五版》(蓝宝书)
CC老师_HelloCoder的教学

本文为L_Ares个人写作,包括图片皆为个人亲自操作,以任何形式转载请表明原文出处。

OpenGL中的专业名词非常的重要,是重中之重,是开启OpenGL后续学习的必备知识库,所以第一节记录OpenGL中各种专业名词的概念,以及我个人对其的理解。

如果没有对OpenGL的专业名词有一定的掌握程度,那么后面的学习难度绝对势比登天。所以再次强调这个基础的在重要性中的C位。

首先,先将2D和3D的概念抽离出来,因为这两个不专属于OpenGL这一范畴,很多知识点都需要这个概念。

2D含义:

即二维空间,可抽象成坐标系中的二维笛卡尔坐标系,由x轴,y轴,原点组成。人们用平面的直线,圆,多边形等构造的图形,都属于2D图形。

3D含义:

即表示正在描述或者显示的物体拥有3个维度:宽度,高度,深度。一般由x轴,y轴,z轴,原点组成。本质上讲,计算机3D图形实际也是平面图形,它只是在计算机屏幕上显示的二维图像,但是我们可以赋予它深度的错觉。

所以,可以这么理解:

3D = 2D + 透视

一、OpenGL上下文

  1. 概念:

首先,我们确定一个概念,OpenGL的上下文实质类似一个状态机。
在OpenGL执行任何一个指令或动作之前,首先需要创建一个OpenGL的上下文,这个上下文类似一台状态机,存储了OpenGL中的各种状态。

  1. 特点:

由于OpenGL的上下文是一台庞大的状态机,所以切换上下文会产生巨大的系统开销,但是不同的绘制模块存在需要完全独立的状态管理的可能性,所以:
(1)在应用程序中,OpenGL的上下文,可以创建多个不同的。
(2)OpenGL的上下文共享纹理,缓冲区等资源。
所以,在必要的情况下,创建多个上下文,在不同的线程中使用不同的上下文控制共同的资源,要比不停的切换上下文,或者大量修改渲染状态要更高效。

  1. 实质:

(1)OpenGL图形API是面向过程的函数。
(2)想要对OpenGL中的对象做操作,先要将对象设置为当前对象。
(3)OpenGL函数实质上都是将对象放在OpenGL上下文这个状态机中进行操作。
(4)如果想要面向对象,可以自己封装OpenGL的函数指令。

二、OpenGL状态机

上面我们提到了OpenGL的上下文是一个庞大的状态机,但是什么是状态机,状态机的作用和功能又是什么呢?

状态机本身是一个非常抽象的概念。但是从名字也可以看出来,他是一个记录有关状态的“机器”,其实它是表示一组状态变量的集合。每个状态变量可以有不同的描述值,或者只有打开或者关闭等状态。

状态机记录了一个对象在其整个生命周期中所经历的各种状态、状态间的转变、
发生转变的动因和条件、以及在发生转变的过程中执行的动作。在我的观点中,它类似一个什么都不会的机器人,你教给他什么,他就会记住你告诉过他的所有内容,并且按照这个去做,如果你不告诉他需要做事情,那么他就会停止。

OpenGL状态机拥有的特点:

(1)记忆功能。OpenGL状态机会记录当前的状态。
(2)具备I/O流。可以接受输入,并且有输出。它会对比原有的状态和输入的状态,作出应有的修改,并且修改之后输出。
(3)具有停机状态。当处于停机状态的时候,OpenGL状态机将不会再接受输入,并且停止工作。

延展一下,既然OpenGL中,任何的指令都要发生在上下文的这个状态机中,那么,状态机的特征其实就代表了OpenGL的特征。所以,可以得到如下的总结:

(1)OpenGL可以记录自己的状态。eg.:使用颜色,开启混合等。
(2)OpenGL可以接收输入,在我们使用OpenGL的函数的时候,实际上OpenGL就是在接收我们的输入。收到我们的输入后,OpenGL会对比原有状态和现有状态并作出该有的修改,然后输出结果,也就是显示我们想要的结果。
(3)OpenGL具有停机状态。在应用程序退出之前,OpenGL是要停止工作的。

三、渲染

概念:将数字和图形数据转换成3D空间图像的操作叫做渲染(Rendering)。

渲染具有动词和名词的两种状态。那么我们分开来理解一下。

渲染(动词):计算机创建三位图像时经历的过程。

渲染(名词):仅仅指最终的图像作品。

四、顶点相关

1.顶点

概念:在绘制图形的时候,图形的顶点的位置数据。可以直接存储到数组中,也可以缓存在GPU的内存中。

2. 顶点数组

概念:开发者在调用绘制方法的时候,直接由内存传入顶点数据,这部分存储在内存当中的顶点数据,被叫做顶点数组。

3. 顶点缓冲区

概念:为了提高绘制的效率和性能,可以提前分配一块显存,将顶点预先传输到这块显存中,而这一部分提前分配的显存,就被称作顶点缓冲区。

五、管线

1. 管线

概念:其实管线可以理解为一条渲染的流水线,既然是流水线那么一定是有顺序的,因为水流是从上至下的流经水管的每个点。而管线则是显卡处理原始图形数据的时候的一个管道,经过这个管道,数据经过各种变化、加工、处理,最终显示到屏幕上的过程。

2. 固定管线

概念:OpenGL的早期,很多的功能API都是封装好的,很多的处理包括光照、坐标变换、剪裁等等功能的shader都是固定的,不需要开发者来自定义的,只允许传入参数,然后返回结果,这种管线就是固定管线。

3. 可编程管线

概念:在固定管线的基础过程上,允许加入自己的一些逻辑的管线。也就是说,在一个允许的范围里,我们可以定制想要的效果,这种绘制管线,就是可编程管线。

六、着色器

1. 存储着色器

概念:类似于上面的固定管线,存储着色器仅仅是由GLTools里面的C++类GLShaderManager进行管理的,仅仅用来满足通常渲染的基本需求的着色器。你并不需要也不可以去定义它,只要传参甚至直接使用即可。但是在提交任何渲染图形进行渲染之前,必须要存在一个着色器。

2. 着色器程序(Shader)

概念:因为OpenGL的核心框架中,并没有提供任何的内建渲染管线,所以在提交图形进行渲染之前,必须要制定一个程序来进行渲染,这个程序就是着色器程序。

常见的着色器有:

  1. 顶点着色器(VertexShader)
  2. 片元着色器/片段着色器(FragmentShader)/像素着色器(PixelShader)
  3. 几何着色器(GeometryShader)
  4. 曲面细分着色器(TessellationShader)

其中非常重要的就是顶点着色器和片元着色器。

OpenGL在处理shader的时候,和其他的编译器相同,也是通过编译和链接等步骤生成了着色器程序。着色器程序同是包含了顶点着色器和片元着色器的运算逻辑。

3. 顶点着色器(VertexShader)

概念:用来计算图形顶点属性的程序,处理图形每个顶点的变换。

特性:

(1)将图形的每一个顶点都进行顶点计算,每一个顶点都会执行一遍顶点着色器程序。
(2)顶点着色器程序的执行方式是并行。
(3)在顶点着色器程序计算的过程中间,无法访问其他顶点的数据。

典型的需要顶点着色器处理的变换包括顶点坐标变换、逐顶点光照运算等等。顶点坐标由自身坐标系转换到归一坐标系的坐标转换也是发生在这里的。

4. 片元着色器(FragmentShader)

概念:处理图形中每一个像素点的数据计算的程序。

特点:

(1)片元着色器是逐个像素点计算的,也就是每个像素点都要执行一遍片元着色器
(2)片元着色器的执行是并行的。

5. GLSL(OpenGL Shading Language)

概念:GLSL是OpenGL中开发着色器的编程语言。

在上面我们提到了着色器有存储着色器和着色器程序,也就是可编程和不可编程的着色器,GLSL就是可编程的着色器程序需要使用的开发语言。

GLSL是在图形卡的GPU上执行的,代替了固定渲染管线上的一部分,使渲染管线中不同的层次具有可编程性,比如视图转换、投影转换等。

GLSL的着色器代码也分成了两个部分:顶点着色器代码和片元着色器代码。

七、光栅化

概念:(蓝宝书)实际绘制或填充每个顶点之间的像素形成的线段叫做光栅化。

光栅化是把顶点数据转化为片元的过程。具有将图转化为一个个栅格组成图像的作用,也就是将矢量图转化为像素点的过程。还有一个更简单理解的,就是将物体的数学描述及物体的颜色信息转换为屏幕上对应位置的像素及用于填充像素的颜色,这个过程也就是光栅化。这是一个将模拟信号转换为离散信号的过程。

光栅化包含了两部分工作:

第一部分:决定窗口坐标中,哪些整型栅格区域被基本图元占用。
第二部分:分配一个颜色值和一个深度值到各个区域。

在官方的翻译中,光栅化又叫做栅格化或者像素化。光栅化的特点是片元中的每一个元素都对应了帧缓冲区中的一个像素。

八、纹理

纹理可以理解为图片。在渲染图形的时候,为了让图形显示更加的逼真,通常会使用图片来渲染图形,这个图片在OpenGL中被我们叫做纹理。

九、混合(Blending)

概念:实现物体透明度的一种技术叫做混合,也就是对颜色的取舍。

当像素经过所有的测试阶段之后,依然没有被剔除,那么该像素的颜色将会和帧缓冲区上颜色附着区域已有的颜色进行混合。两种颜色经过透明度的调和取舍形成新的显示效果。

OpenGL中提供了混合算法,但是提供的算法是有限的,如果OpenGL提供的算法并不满足开发者的混合需求,那么开发者可以在像素着色器,也就是片元着色器中自己实现一个混合算法。自己实现的混合算法的性能会比OpenGL自带的混合算法的性能差一些。

十、矩阵

1. 变换矩阵(Transformation):

可以使用变换矩阵令图形发生平移,缩放,旋转变换。

2. 投影矩阵(Projection):

将3D物体的坐标转换成2维屏幕坐标的矩阵。

十一、渲染上屏/交换缓冲区(SwapBuffer)

1. 渲染缓冲区

渲染缓冲区一般映射的是显示图形的资源,比如窗口。当我们将图形渲染到窗口所对应的渲染缓冲区的时候,图形也就会显示。

一般情况下,OpenGL程序的渲染缓冲区不止一个,原因是如果在渲染的过程中出现了刷新等打断或者重新渲染的情况,那么窗口显示出的图形将会出现错乱。
为了解决这个问题,OpenGL程序至少都有两个渲染缓冲区,当一个图形渲染完成后,与另外一个渲染缓冲区用来相互交换,这样就解决了可能存在的显示图形错乱的问题。

屏幕缓冲区:

显示在屏幕上的渲染缓冲区被称作屏幕缓冲区。

离屏缓冲区:

没有显示在屏幕上的渲染缓冲区被称作离屏缓冲区。

2. 垂直同步和垂直信号

由于显示器的刷新一般是逐行进行的。因此为了防止交换缓冲区的时候,屏幕上下区域的图形分属两个不同的帧,因此交换一般会等待显示器刷新完成的信号,在显示器两次刷新的间隔中间进行交换,这个信号就叫做垂直同步信号,这个过程就叫做垂直同步技术。

3. 三缓冲区技术

由于双缓冲区和垂直同步的技术中,总是要等待缓冲区交换之后,才会进行下一帧的渲染,这样不能完全的发挥硬件的最大性能,所以又提出了三缓冲区技术。

在等待垂直同步的同时,来回的交替渲染两个离屏缓冲区,当垂直同步发生的时候,屏幕缓冲区和最近渲染完成的离屏缓冲区进行交换,这就是三缓冲区技术。可以将硬件的性能发挥到更大。

以上是本文介绍的OpenGL中的一部分专业名词,后期会根据学习,逐渐添加。

上一篇下一篇

猜你喜欢

热点阅读