了解OpenGL专业名词
2019-05-19 本文已影响0人
瀚_
上下文 Context
- context记录了OpenGL渲染需要的所有信息,如当前绘制使用的颜色、是否有光照计算及开启的光源等我们在使用OpenGL函数调用设置的状态和状态属性,所以上下文是一个非常庞大的状态机。
- 在切换上下文往往会产生较大的开销,而在不同的绘制模块可能需要独立管理设置的状态和状态属性。因此,可以在应用程序中创建多个上下文,在不同线程中使用不同的上下文,而上下文之间共享纹理、缓冲区资源。这样比反复切换上下文,或者大量修改渲染状态更加高效。
状态机
状态机描述了了⼀一个对象在其⽣生命周期内所经历的各种状态,状态间的 转变,发⽣生转变的动因,条件及转变中所执⾏行行的活动。具有以下特点:
- 记住当前状态
- 接收输入,根据输入的内容和自己原先状态,修改自己当前状态,并且有对应输出
- 当进⼊特殊状态(停机状态)的时候,不再接收输⼊,停⽌工作
渲染 Rendering
将图形/图像数据如顶点数据、片元数据(颜色或纹理)、观察位置、光源等,转换成3D空间图像(即符合3D场景看到的图像)操作叫做渲染。
渲染流程.png
顶点数组 VertexArray 和 顶点缓冲区 VertexBuffer
- 顶点数据是所要画的图像的骨架。在调用绘制方法是,直接由内存传入顶点数据。存储顶点数据的这块连续内存,被称为顶点数组。
- 而性能更高的做法是,提前分配一块显存,将顶点数据预先传入显存。这部分显存,被称为顶点缓冲区。
图元
- 组成图像的基本单元,在OpenGL中,有3中类型的图元: 点、线、三角形。
着色器程序
着色器程序同时包含了顶点着色器和片段着色器的运算逻辑。
在OpenGL进行绘制的时候,首先由顶点着色器对传入的顶点数据进行运算。再通过图元装配,将顶点转换为图元。然后进行光栅化,将图元这种矢量图形,转换为栅格化数据。最后,将栅格化数据传入片段着色器中进行运算。片段着色器会对栅格化数据中的每个像素进行运算,并决定像素的颜色。
顶点着色器 VertexShader
- 用来处理图形的每个顶点变换如旋转、平移、投影等。
- 顶点着⾊器是逐顶点运算的程序,也就是说每个顶点数据都会执⾏一次顶点着⾊器,当然这是并行的,并且顶点着⾊器运算过程中无法访问其他顶点的数据。
- ⼀般来说典型的需要计算的顶点属性主要包括顶点坐标变换、逐顶点光照运算等等。顶点坐标由⾃身坐标系转换到归⼀化坐标系的运算,就是在这里发⽣的。
片段着色器 FragmentShader
- 用来处理图形中每个像素点颜色计算和填充。
- 片段着⾊器是逐像素运算的,也就是说每个像素都会执⾏一次⽚段着⾊器,当然也是并⾏的。
GLSL(OpenGL Shading Language)
- ⽤来在OpenGL中着色编程的语言,也即开发人员写的自定义程序,他们是在图形卡的GPU上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。⽐如:视图转换、投影转换等。GLSL的着⾊器代码分成2个部分: Vertex Shader(顶点着⾊色器)和Fragment(⽚段着色器)
光栅化
- 图形管线的输入是图元顶点,输出的则是像素,这个步骤其中还有一个中间产物叫做片段(fragment)。一个片段对应一个像素,但片段比像素多了用于计算的属性,如:深度值和法向量。通过片段能够计算出最终将要生成像素的颜色值,把输入顶点计算出片段的过程叫做光栅化。
- 光栅化的输入是组成图元的顶点结构,输出的就是片段结构。
纹理
纹理也可以理解为图片。
混合(Blending)
存在半透明的颜色与另外一种颜色进行混合计算得到新的颜色的过程。
变换矩阵(Transformation)
图形需要发生平移、缩放、旋转变换,就需要使用变换矩阵
投影矩阵(Projection)
将3D坐标转换为⼆维屏幕坐标,实际线条也将在⼆维坐标下进行绘制。
渲染上屏/交换缓冲区(SwapBuffer)
- 渲染缓冲区一般映射的是系统的资源比如窗口。如果将图像直接渲染到窗口对应的渲染缓冲区,则可以将图像显示到屏幕上。
- 如果每个窗口只有一个缓冲区,那么在绘制过程中屏幕进行了刷新,窗口可能显示出不完整的图像。
- 为了解决这个问题,常规的OpenGL程序⾄少都会有两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像在屏幕上的显示。
- 由于显示器的刷新⼀般是逐⾏进行的,因此为了防止交换缓冲区的时候屏幕上下区域的图像分属于两个不同的帧,因此交换一般会等待显示器刷新完成的信号,在显示器器两次刷新的间隔中进行交换,这个信号就被称为垂直同步信号,这个技术被称为垂直同步
- 使⽤了双缓冲区和垂直同步技术之后,由于总是要等待缓冲区交换之后再进⾏下⼀帧的渲染,使得帧率无法完全达到硬件允许的最高水平。为了解决这个问题,引入了三缓冲区技术,在等待垂直同步时,来回交替渲染两个离屏的缓冲区,⽽垂直同步发生时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,实现充分利⽤硬件性能的目的。
参考
https://www.jianshu.com/p/a7096a6c16a7
https://www.jianshu.com/p/1b09101aa117