GPU管道
GPU会把管道分为以下几个子阶段。
1.顶点着色器:
顶点着色器(vertex)阶段是完全可编程的。顶点着色器负责变换及着色顶点。
顶点着色器的输入是单个顶点。此阶段会进行投影、逐顶点光照以及为动画角色计算蒙皮。
顶点着色器也可以通过修改顶点位置来产生程序化动画,称为顶点动画。
顶点着色器的输出是完成变换和光照等计算的齐次裁剪空间表示的顶点。
在较新的GPU中,顶点着色器能完全存取纹理数据,而较旧的GPU只容许像素着色器存取纹理。(可以把纹理当独立的数据结构使用)
2.几何着色器:
可选的几何着色阶段也是完全可编程的。几何着色器处理以齐次裁剪空间表示的整个图元。它能剔除或修改输入的图元以及生成新的图元。
几何着色器的输入为单个n顶点几何图元,以及最多n个作为控制点的额外顶点。其输出为0或多个图元,这些图元种类可与输入有所不同。
几何着色器能实现非常多非常复杂的效果。常见的有布料模拟、阴影体积拉伸、毛发鳍拉伸、动态镶嵌,分形细分等。
3.流输出:
现在的CPU允许把到达此管道的数据写回内存。数据能从那里回到管道开始做进一步处理。此功能称为流输出(streaming out)。
使用流输出很多视觉效果可以不经CPU实现比如头发渲染。头发通常是由三次样条曲线表示的,以往头发通常在CPU上物理模拟,然后在CPU上把样条细分为线段,然后交给GPU渲染。有了流输出,GPU可以用顶点着色器和几何着色器完成物理模拟和细分线段。然后通过流输出技术把线段重新流入管道之初去渲染。
4.裁剪:
裁剪(clipping)阶段把三角形在平截头体以外的部分切掉。其原理是先判定哪些顶点在平截头体之外,然后求出三角形与平截头体平面之间的交点。这些交点会成为裁剪后一个或多个三角形的新顶点。
此阶段是固定功能,但提供有限度配置,例如定义额外的裁剪平面。
5.屏幕映射:
屏幕映射只是简单地缩放平移顶点。变换至屏幕空间。
此阶段完全固定不能配置。
6.三角形建立:
三角形建立(triangle setup)阶段,光栅化硬件开始快速地把三角形转换成片段。
此阶段是不能配置的。
7.三角形遍历:
三角形遍历(triangle traversal)阶段把三角形分解为片段,即光栅化。通常是每个像素产生一个片段,除非是使用MSAA。
三角形遍历也会对顶点进行属性插值,以产生逐片段属性,有需要时此过程会使用透视校正插值。
此阶段是固定且不能配置的。
8.提前深度测试:
许多显卡能够在此时间点检查片段深度,如果被遮挡就丢弃片段直接跳过像素着色阶段。
但是过去的GPU设计中,深度测试和alpha测试都是在像素着色器之后才进行的。所以此阶段称为提前深度测试(early depth test)。
9.像素着色器:
像素着色是完全可编程的阶段。其工作是为每个像素着色。
此阶段输入是一组逐片段属性。而输出是一个颜色矢量。
10.混合阶段:
混合阶段(blending stage)又称合并阶段(merge stage)。NVIDIA称为光栅运算阶段(raster operation stage, ROP)。
此阶段不能编程,但能高度配置。此阶段负责执行多个片段测试,包括深度测试、alpha测试、模板测试。
如果片段通过了所有测试,其颜色就会与帧缓冲原来的颜色进行混合(合并)。混合方式由alpha混合函数(alpha blending function)控制,此函数的结构是固定的,但可以配置其运算符以及参数产生各种混合运算。
(END)