顶点着色器是流水线的第一个阶段,它的输入来自于CPU。顶点着色器的处理单位是顶点,也就是说输入进来的每一个顶点都会调用一次顶点着色器。
顶点着色器须要完成的工做主要有:坐标变换和逐顶点光照。固然,除了这两个主要任务外,顶点着色器还能够输出后续阶段所需的数据。
坐标变换,顾名思义,就是对顶点的坐标进行某种变换。例如咱们能够经过改变顶点位置来模拟水面,布料等。
一个最基本的顶点着色器必须完成的一个工做是:把顶点坐标从模型空间转换到齐次剪裁空间。相似下面代码:编程
o.pos=mul(UNITY_MVP,v.position);
因为咱们的场景可能会很大,而摄像机的视野范围颇有可能不会覆盖全部的场景物体,一个很天然的想法就是,那些不在摄像机视野范围内的物体不须要被处理,而裁剪就是为了完成这个目的而被提出来的。
一个图元和摄像机的关系有3种:测试
这一步输入的坐标仍然是三维坐标系。屏幕映射的任务是把每一个图元的x和y坐标转换到屏幕坐标系下,屏幕坐标系是一个二维坐标系,它和咱们用于显示画面的分辨率有很大关系。
屏幕映射获得的屏幕坐标决定了这个顶点对应屏幕上哪一个像素以及距离这个像素有多远。
opengl的屏幕坐标原点是左下角,而directx是左上角,若是你发现你获得的图像是倒转的,那么颇有可能就是这个缘由形成的。code
由这一步就进入了光栅化阶段,从上一个阶段输出的信息是屏幕坐标下的顶点位置以及和它们相关的额外信息,如深度值、法线方向、视角方向等,光栅化有两个最重要的目标:计算每一个图元覆盖了哪些像素,以及为这些像素计算他们的颜色。光栅化的第一个流水线阶段是三角形设置,这个阶段会计算光栅化一个三角网格所需的信息。
具体来讲,上一个阶段输出的都是三角网格的顶点,即咱们获得的是三角网格每条边的两个端点。但若是要获得整个三角网格对像素的覆盖状况,咱们就必须计算每条边上的像素坐标。为了可以计算边界像素的坐标信息,咱们就须要获得三角形边界的表示方式。这样一个计算三角形网格表示数据的过程就叫作三角形设置,它的输出是为了下一个阶段作准备。it
三角形遍历阶段将会检查每一个像素是否被一个三角形网格所覆盖。若是被覆盖的话,就会生成一个片元,而这样一个找到哪些像素被三角网格覆盖的过程就是三角形遍历,这个阶段也被称为扫描变换。
三角形遍历阶段会根据上一个阶段的计算结果来判断一个三角网格覆盖了哪些像素,并使用三角网格3个顶点的顶点信息对整个覆盖区域的像素进行插值。io
片元着色器是另外一个很是重要的可编程着色器阶段,片元着色器的输入是上一个阶段对顶点信息插值获得的结果,更具体来讲,是根据那些从顶点着色器输出的数据插值获得的。而它的输出是一个或多个颜色值。
这一阶段能够完成不少重要的的渲染技术,其中最重要的技术之一就是纹理采样。为了在片元着色器中进行纹理采样,咱们一般会在顶点着色器阶段输出每一个顶点对应的纹理坐标,然和通过光栅化阶段对三角网格的3个顶点对应的纹理坐标进行插值后,就能够获得其覆盖的片元的纹理坐标了。渲染
逐片元操做是opengl中的说法,在directx中,这一阶段被称为输出合并阶段。
这一阶段有几个主要任务:遍历
若是一个片元经过了全部的测试,就须要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并技术
至此,整个GPU渲染管线就结束了。数据