OpenGL学习笔记:第四章 OpenGL处理管线(流程)(OpenGL渲染管线的对比,渲染管线的结构,着色器,名词解释和中英文对照)

OpenGL渲染管线

传统的可编程图形硬件处理管线流程(通用流程)

在这里插入图片描述
在这种传统的图形处理流程中,首先经过顶点级的光照计算和坐标变换,求出每个顶点的光照颜色值,同时还将顶点坐标从物体坐标系转化到裁剪空间(clip space),然后对每个三角形进行光栅化处理,并对三角形顶点的颜色进行双线性插值,得到三角形中每一个像素的颜色值,接着进行纹理映射,即根据每一个像素的纹理坐标值将纹理图颜色分配到每个像素上,最后进行颜色混合计算和雾化效果计算,得到的结果将会放到帧缓存并且显示到屏幕。

图形硬件技术处理渲染管线总体流程(OpenGL流程)

在这里插入图片描述
可见此图中引入了顶点着色器和片段着色器,使得用户可以通过程序控制图形流水线的执行,极大提高了GPU的能力并且扩展了适用范围。
其中,第二步和第六步是不需要程序员参与的,第四步和第五步可以没有,第八步可以不参与其中,使用默认即可,剩下的是必需要实现的了。下面的内容会详细介绍该流程。

传统流程与OpenGL流程对比

在这里插入图片描述
其中,虚线部分代表可编程图形硬件的处理流程,模块里的代表可编程模块。

OpenGL可编程管线结构

在这里插入图片描述

OpenGL流程与结构名词解释及中英文对照

顶点缓冲区对象或顶点数组对象(Vertex Buffer/Array Objects,VBO/VAO)

是cpu提供给GPU的顶点信息,包括了顶点的位置、颜色(只是顶点的颜色,和纹理的颜色无关)、纹理坐标(用于纹理贴图)等顶点信息。

顶点变换和顶点着色器(Vertex Shader)

所有的图形在计算机中都是一串串数据,在三维坐标系中可以表示为一个N*3的矩阵,N为顶点的数量,3分别代表x、y、z位置坐标,顶点变换就是通过一系列矩阵变换在坐标系中对顶点进行平移、缩小\放大、旋转等操作。
顶点着色器用于处理顶点相关的数据,一般就是变换矩阵、顶点的颜色、纹理坐标。

在这里插入图片描述

图元装配(Primitive Assembly)

图元装配就是告诉电脑怎么去连接这些顶点,例如三个点,可以画成一个三角形,也可以连成两条直线。
在这里插入图片描述

细分着色器(Tessellation shaders)

可以把基本图元细分为更多的基本图形,创建出更加平滑的视觉效果。顶点着色器只能处理每个顶点关联的数据,而细分着色能通过面片的形式分割更多的数据点。细分示例如下图(其中黑色点表示输入的控制点,其他连接处的点就是通过面片细分出来的点)
在这里插入图片描述

几何着色器(Geometry Shader)

把基本图元形式的顶点的集合作为输入,可以通过产生新顶点构造出新的基本图元来生成其他形状。
在这里插入图片描述
相较于其他类型的着色器,几何着色器有着独特的特性,它一次处理一个完整图元(点、线、面),并且能改变OpenGL渲染管道中的数据量。顶点着色器一次只能处理一个顶点,并且处理该顶点时不能获取其他顶点的信息,同时它是严格遵守单个顶点输入,单个顶点输出原则。曲面细分着色器操作图块(Patches),也可以设置曲面细分因子,但是对图块是怎样细分的控制能力并不强,也不能生成不连续的图元。相似的,片段着色器每次也仅能处理单个片段,不能获取其他片段的数据,不能新建片段,只能通过丢弃的方式销毁片段。另一方面,几何着色器可以获取到一个图元内(通过指定GL_TRIANGLES_ADJACENCY模式图元最多支持6分顶点)的所有顶点数据,能够改变图元的类型,甚至能创建和销毁图元。

在OpenGL渲染管道中,几何着色器是一个可选部分。当几何着色器不存在时,使用从顶点着色器或者曲面细分着色器输出的顶点数据在图元内部进行插值,然后依次将各个片段传递给片段着色器,最后实现图元的渲染。然而当几何着色器存在的时候,从顶点着色器和曲面细分计算着色器的输出数据将被传递到几何着色器,几何着色器重组的图元将对变成我们将要插值的对象,最后在将插值后的各个片段传递给片段着色器。另外几何着色器在重组图元的时候,它还可以对每个创建的图元都应用一个变形矩阵。

光栅化(Rasterization)

光栅化是将图元转化为一组二维片段的过程,然后,这些片段由片段着色器处理(片段着色器的输入)。这些二维片段代表着可在屏幕上绘制的像素。用于从分配给每个图元顶点的顶点着色器输出生成每个片段值的机制称作插值(Interpolation)。实际上就是从cpu提供的分散的顶点信息是如何变成屏幕上密集的像素的,图元装配后顶点可以理解成变为图形,光栅化时可以根据图形的形状,插值出那个图形区域的像素(纹理坐标v_texCoord、颜色等信息)。注意,此时的像素并不是屏幕上的像素,是不带有颜色的。接下来的片段着色器完成上色的工作。
在这里插入图片描述

片段着色器(FragmentShader)

片段着色器为片段(像素)上的操作实现了通用的可编程方法,光栅化输出的每个片段都执行一遍片段着色器,对光栅化阶段生成每个片段执行这个着色器,生成一个或多个(多重渲染)颜色值作为输出。
在这里插入图片描述

逐片段操作(Per-Fragment Operations)

在这里插入图片描述
在这里插入图片描述
具体包含下列几个过程:

  1. 像素归属测试(pixelOwnershipTest):这个用来确定帧缓冲区中位置(x,y)的像素是不是归当前上下文所有。例如,如果一个显示帧缓冲区窗口被另一个窗口所遮蔽,则窗口系统可以确定被遮蔽的像素不属于此opengl的上下文,从而不显示这些像素。
  2. 剪裁测试(ScissorTest):如果该片段位于剪裁区域外,则被抛弃。
  3. 模板和深度测试(StencilTest and DepthTest):主要是通过对像素的运算出来的深度,也就是像素离屏幕的距离进行对比,根据OpenGL设定好的深度测试程序,决定是否最终渲染到画布上。一般默认的程序是将离屏幕较近的像素保留,而将离屏幕较远的像素丢弃。如果像素最终被渲染到画布上,根据设定好的OpenGL深度覆写状态,可能会更新帧缓冲区上深度附着的值,方便进行下一次的比较。
  4. 混合(Blending):将新生成的片段颜色值与保存在帧缓冲区的颜色值组合起来,产生新的RGBA。
  5. 抖动(Dithering):在混合阶段过后,根据OpenGL的状态设置,会决定是否有抖动这个阶段。抖动是一种针对对于可用颜色较少的系统,可以以牺牲分辨率为代价,通过颜色值的抖动来增加可用颜色数量的技术。抖动操作是和硬件相关的,允许程序员所做的操作就只有打开或关闭抖动操作。实际上,若机器的分辨率已经相当高,激活抖动操作根本就没有任何意义。默认情况下,抖动是激活的。

着色,纹理(Textures)

就是对图元进行颜色渲染或者纹理渲染,注意这里的颜色或者纹理并不代表可以实际看见,必须光栅化后输出帧缓存才能实际可见。

转换反馈(Transform Feedback)

粒子系统是为了模仿一些自然现象(比如烟,灰尘,烟火,雨等)所使用的技术的一个通用名字。在这些现象中,共同的地方就是它们是由大量的小粒子所组成,这些小的粒子以某种方式在一起移动,这样就构成了一种自然现象。为了模仿一个由粒子组成的自然现象,我们通常需要维护每一个粒子的位置信息和一些其他的属性(速率,颜色等等)。实现思路是在 GS(如果没有使用 GS 则是 VS)处理之后,我们可以将变换之后的图元存放到一个特殊的缓存——Transform Feedback Buffer 中。此外,我们可以决定图元是否将继续按照以前的流程进行光栅化。在下一帧渲染的时候,上一帧中输出的顶点信息可以在这一帧中作为顶点缓存使用,在这样的一个循环过程中,我们可以不借助于应用程序来实现对粒子信息的更新。

上述内容如有不准确之处,欢迎批评指正,共同交流!

猜你喜欢

转载自blog.csdn.net/KingsMan666/article/details/114102608