Pipeline
前言(Introduction)
Pipeline 是指图形系统对图像信息进行一系列处理的过程,这些图像信息包括顶点信息(坐标、法向量…),像素信息(图像、纹理…)等,最终这些处理好的数据将被放到帧缓冲区(FrameBuffer
)中供应用获取。
图1-Pipeline过程
a.输入装配器(Input assembler) : 从Vertex Buffer 或 Index Buffer 中搜集原始顶点数据。
B.顶点着色器(Vertex Shader): 每一个顶点都会运行一次Vertex Sahder,它将顶点的原始坐标(model space)转换成屏幕坐标(screen space),并为pipeline的下一个阶段提供输入。
c.细分着色器(Teseellation) : 将几何图形细分成更多、更小的三角形使得渲染表面和边缘更加平滑。如下图:
图2-细分
d.几何着色器(Geometry Shader) :作用于每一个图原(primitive)(点,线,三角形),在操作的过程中可能会丢失部分图原,也能会增加图原,功能和Teseellation差不多,但更为复杂,Geometry Shader现在用的并不多,除了Intel的集成显卡外,它在其他类型显卡上的运行性能让人抓狂。
e.光栅化(Rasterization) : 可能叫做像素化更好理解一些。它将图原(primitive)离散成片原(fragments),每一个片原代表FrameBuffer中的一个像素信息,对应于屏幕上的一点的颜色和不透明度等信息,屏幕外的片原将被丢弃,Vertex Shader 的输出结果会和片原做进一步的插值计算。由于深度关系,那些在其他片原后面的片原同样会被丢弃。如下两幅图:
图3-边缘像素化
图4-区域像素化
f.片原着色器(Fragment Shader) : 对于每一个片原,Fragment Shader 都会调用一次,并决定片原使用何种颜色和何种深度值来填充哪一个FrameBuffer(s)。你可以使用来自Vertex Shader的被插值后的数据,这些数据可以包含用于光照的的纹理坐标和法线。
g.颜色混合器(Color blending) : 用于混合在同一FrameBuffer 中不同片原映射的同一像素的情况,你可以选择覆盖、相加或混合它们。
图1-Pipeline 过程图中,绿色的模块表示固定的功能,它们所做的工作已经被预定义好了,不过你可以通过一些参数来进行一些设置。而橙色的模块属于可编程部分,这意味着你可以编写自己的代码使显卡按照你的目的去执行。
在Vulkan中Pipeline 是不可改变的,这意味着如果你想改变着色器、绑定不同的FrameBuffer、改变混合功能(blend function),etc,你必须从头开始重建Pipeline。喜忧参半…。
由于你使用Pipeline的具体目的不同,一些可编程模块就成了可选项,比如,如果你只想画一个几何图形,那么Teseellation 和 Geometry Sahder 就可以不需要了。