GPU流水线
主要分为两个阶段:几何阶段和光栅化阶段
几何阶段
顶点着色器 ——> 曲面细分着色器(可选)----->几何着色器(可选)----->裁剪——>屏幕映射
顶点着色器
流水线的第一个阶段,输入来自于CPU,处理的基本单位为单个顶点,输入的每个顶点都会调用一次顶点着色器。
主要工作是:坐标变换(比如改变顶点位置模拟水面、布料等)和逐顶点光照,并输出后续阶段需要的数据(常见的输出路径是经光栅化后交给片元着色器处理)。
曲面着色器
一个可选的着色器,用于细分图元。
几何着色器
用于执行逐图元操作,或者用于产生更多的图元
裁剪
将不在摄像机视野的顶点裁剪掉,并剔除某些三角图元的面片(主要处理一部分在视野内另一部分在视野外的图元。
屏幕映射
将每个图元的x和y坐标转换到屏幕坐标系(二维坐标系,与屏幕分辨率有很大关系)
光栅化阶段
三角形设置 ——> 三角形遍历 -----> 片元着色器(可选)——>逐片元操作——>屏幕图像
三角形设置
该阶段计算光栅化一个三角形网格需要的信息。具体来说,上个阶段输出过来的都是三角网格的顶点,即三角网格每条边的两个端点。但如果要得到整个三角网格对像素的覆盖情况,我们就必须计算每条边上的像素坐标。为了能够计算边界像素的坐标信息,我们就需要得到三角形边界的表示方法。这就是一个计算三角网格表示数据的过程。
三角形遍历
该阶段会检查每个像素是否被一个三角网格覆盖,如果被覆盖就会生成一个片元。该阶段会根据上一阶段的计算结果判断一个三角网格覆盖了哪些像素,并用三角网格的三个顶点的信息对覆盖区域的像素进行插值。这一阶段会输出一个片元序列。
片元着色器
顾名思义,给每个像素着色。该阶段可由开发者编程实现一些渲染效果,并完成很多重要的渲染技术,如纹理采样等。片元着色器仅能影响单个片元。
逐片元操作
在DriectX中又称为输出合并阶段。
主要任务:1)决定每个片元的可见性。如进行深度测试、模板测试。
2)如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并,或者说混合。