龙书中说:渲染流水线是以摄像机视角生成2D图像的一系列过程。个人感觉:渲染流水线是以摄像机视角生成2D图像一个像素的一系列过程。
GPU生成多个像素是并行的,每个像素都由渲染流水线这个串行过程。把这个过程想象成一个工厂流水线:
一、输入装配阶段(分拣员)
今早车间进购了一批原材料,不仅有整车的原料(各种Buffer),还有原料清单(描述符堆/描述符),分拣员的工作就是对照原料清单把原料分拣归纳。
CPU给GPU(我们的流水线车间)发来了一堆的顶点数据(vertex)和数据组(index),输入装配根据图元拓扑关系进行分拣组合
cmdList->IASetVertexBuffers(0, 1, &ri->Geo->VertexBufferView());
cmdList->IASetIndexBuffer(&ri->Geo->IndexBufferView());
cmdList->IASetPrimitiveTopology(ri->PrimitiveType);
分拣的具体要求:结合图元拓扑关系组合数据,例如:把第偶数个三角形前两个顶点索引翻转,保证绕序一致。
二、顶点着色器(只会矩阵的数学天才)
for(auto item:Invertices){OutVertices.push_back(VertexShader(item));}
这个加工工具VertexShader,可以把分拣员给他的每个节点item都加工一下,主要进行矩阵变换,然后进入下一阶段。
三、曲面细分(专业摸鱼)
近距离盯着才有作用,稍远就无作用(摸鱼)
作用:
- 1.CPU内存存储维护低模,占用资源少,流畅;
- 2.CPU端低模状态模拟动画和物理效果,交给后续GPU使用高模获得好的视觉效果。
四、几何着色器(关系户)
这是个关系户,他知道一些别人不知道的特殊规则,对于前三位同事的结果,他会对于某些特别要求的细节他会进行丰富(把一个点拓展为一个线,面等)或者销毁。
五、剪裁(1#质检员)
用透视除法(齐次坐标)去检查,所有不在他这个范围内的点都不能要。这个过程是硬件封装好的,在VS之后,PS之前做。
六、光栅化(网格员)
将裁剪后的结果放到视口里边,在NDC中来看,这叫做视口变换,之后将这些结果插值变成一个一个小方格(纹素)给下一阶段。
七、像素着色器(画家)
for(auto item:Infragments){OutVertices.push_back(FragmentShader(item));}
是个画家,他会根据今天天气光线,场景,聚光灯位置,颜色等等不同选择不同的颜色给他的小方格作品着色。
八、输出合并阶段(组装员)
进行逐个组装(Alpha Test和Stencil Test等),对于不合格的他会直接丢弃(discard)。有时候他会把要求一起打包的混合后给出来(blend)。
分拣员,数学天才,摸鱼哥,关系户,1#质检员,网格员,画家和组装员,简单的记忆如下:
分数摸(莫)关系,质(织)网画(化)组装。