渲染管线是图形学不可或缺的,在学习它之前,我们先了解一下什么是管线?
管线/流水线
当我们谈到管线时,我们指的是一个由多个阶段组成的过程,每个阶段都完成任务的一部分。在现实世界中,流水线的概念在许多不同领域中都有应用,比如汽汽车工厂的生产线等。
在1913年前福特开发出汽车流水线前,汽车组装只能让一位位工人逐工序完成,年产不过12台,效率极低;而引入了流水线概念后,每位工人只需要不停地做同一道工序,所有工序并行进行,极大地提高了工厂的生产效率。
OpenGL渲染管线
OpenGL采用的就是工厂流水线的方式,这也是为什么大家喜欢把这个绘制过程叫做图形渲染管线。
处理流程
整个处理流程可以被划分为几个阶段,上一个阶段的输出数据作为下一个阶段的输入数据,是一个串行的。每一个阶段分别在GPU上运行各自的数据处理程序,这个程序就是着色器(shader)。部分着色器允许我们使用着色器语言(OpenGL Shading Language)编写自定义的着色器,这样就可以更为细致的控制图像渲染流程中的特定处理过程了,下面是一个图形渲染管线每一个阶段的抽象表示,蓝色部分代表允许自定义着色器。
下面我们对渲染管线的每个流程进行详细说明!!!
- 顶点数据(Vertex Data)
这里的顶点数据并不只是顶点坐标,它可以是顶点的颜色,法向量,纹理坐标等一系列用来绘制顶点的数据的统称,并且这里并不一定要求有顶点坐标(例如绘制圆,可以传入一个顶点坐标和一个半径,顶点着色器、几何着色器可以ui数据进行处理,生成更多的顶点数据)。
这些顶点数据是从CPU传到GPU中,传输是一个开销非常大的过程,因此传输的数据越少越好。
- 顶点着色器(Vertex Shader)
负责处理输入的顶点数据并进行变换,这一阶段是用来处理一个单独的顶点数据,并且只有一个输出,所以是并行操作,可能有很多顶点数据同时使用这个顶点着色器。
着色器一词的来源主要是因为它们最初的作用是对图形物体的颜色进行计算和处理。但随着图形学的发展,着色器已经成为描述图形渲染管线中任何一种可编程阶段的通用术语,不仅仅局限于颜色计算,也可以执行各种图形相关的计算和处理。所以大家不要被这个名词所迷惑,可以叫处理器。
- 形状(图元)装配(Shape Assembly)
根据渲染方式(如点、线、三角形)以及顶点数据,将顶点数据组装成相应的图元。例如,如果渲染方式是三角形,那么就会根据顶点数据组装成三角形。
图元类型 | 应用 |
---|---|
GL_POINTS | 画离散的点 |
GL_LINES | 画线(每两个点连成一条线) |
GL_LINE_STRIP | 画线(所有点相互连接,首尾不相连) |
GL_LINE_LOOP | 画线(所有点相互连接,首尾相连) |
GL_TRIANGLES | 填充三角形(每三个点围成一个,相邻的点之间不填充) |
GL_TRIANGLE_STRIP | 填充三角形(每三个点围成一个,相邻的点之间填充) |
GL_TRIANGLE_FAN | 填充三角形(填充三角形(以第一个点为顶点,之后每两个点合起来围成的三角形进行填充,相邻的点之间填充)) |
GL_QUADS | 填充面(每四个点围成的面进行填充,相邻点之间不填充) |
GL_QUAD_STRIP | 填充面(每两个点构成一条线,每两条线构成一个四边形,相邻点之间填充) |
GL_POLYGON | 填充面(将所有点围成的面进行填充) |
- 几何着色器(Geometry Shader)
创建新的几何图元:例如,从一个输入三角形创建多个输出三角形,从而实现几何细分。
修改几何图元:例如,平移、旋转、缩放或扭曲图元。
丢弃图元:根据特定的条件,可以选择丢弃某些输入图元,以控制输出的图元数量。
它能起到一定的裁剪作用、同时也能产生比顶点着色器输入更多的基础图元。
- 光栅化(Rasterization)
它会把图元映射为最终屏幕上相应的像素。
- 片段着色器(Fragment Shader)
它主要作用是计算一个像素的最终颜色,这也是所有OpenGL高级效果产生的地方,通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可被用来计算最终像素的颜色。
- 测试(Tests)和混合(Blending)
深度测试:当绘制立体物体的时候,使用深度测试可以丢弃物体背面的像素
Alpha测试:可以通过alpha值来丢弃像素。
剪裁测试:通过设置裁剪区域来丢弃像素。
模板测试:模板测试是根据一个模板来进行测试,其目的为了让开发者能够定义自己的测试方法。
混合技术常用于表现物体的透明度,透明的物体的颜色常与位于其之后的物体的颜色进行混合,来达到透明的效果。