共计 1524 个字符,预计需要花费 4 分钟才能阅读完成。
1. 顶点着色器
顶点着色器是流水线的第一个阶段,它的输出来自于 CPU。顶点着色器的解决单位是顶点,也就是说输出进来的每个顶点都会调用一次顶点着色器。
顶点着色器须要实现的工作次要有: 坐标变换和逐顶点光照。当然,除了这两个次要工作外,顶点着色器还能够输入后续阶段所需的数据。
坐标变换,顾名思义,就是对顶点的坐标进行某种变换。例如咱们能够通过扭转顶点地位来模仿水面,布料等。
一个最根本的顶点着色器必须实现的一个工作是: 把顶点坐标从模型空间转换到齐次剪裁空间。相似上面的代码:
o.pos=mul(UNITY_MVP,v.position);
2. 裁剪
因为咱们的场景可能会很大,而摄像机的视线范畴很有可能不会笼罩所有的场景物体,一个很天然的想法就是,那些不在摄像机视线范畴内的物体不须要被解决,而裁剪就是为了实现这个目标而被提出来的。
一个图元和摄像机的关系有 3 种:
齐全在视线内
局部在视线内
齐全在视线外
局部在视线内的图元须要裁剪,例如一条线段的一个顶点在视线内,而另一个顶点在视线外,那么视线内部的顶点应该应用一个新的顶点来代替,这个新的顶点位于这条线段和视线边界的交点处。
3. 屏幕映射
这一步输出的坐标依然是三维坐标系。屏幕映射的工作是把每个图元的 x 和 y 坐标转换到屏幕坐标系下,屏幕坐标系是一个二维坐标系,它和咱们用于显示画面的分辨率有很大关系。
屏幕映射失去的屏幕坐标决定了这个顶点对应屏幕上哪个像素以及间隔这个像素有多远。
opengl 的屏幕坐标原点是左下角,而 directx 是左上角,如果你发现你失去的图像是倒转的,那么很有可能就是这个起因造成的。
4. 三角形设置
由这一步就进入了光栅化阶段,从上一个阶段输入的信息是屏幕坐标下的顶点地位以及和它们相干的额定信息,如深度值、法线方向、视角方向等,光栅化有两个最重要的指标: 计算每个图元笼罩了哪些像素,以及为这些像素计算他们的色彩。光栅化的第一个流水线阶段是三角形设置,这个阶段会计算光栅化一个三角网格所需的信息。
具体来说,上一个阶段输入的都是三角网格的顶点,即咱们失去的是三角网格每条边的两个端点。但如果要失去整个三角网格对像素的笼罩状况,咱们就必须计算每条边上的像素坐标。为了可能计算边界像素的坐标信息,咱们就须要失去三角形边界的示意形式。这样一个计算三角形网格示意数据的过程就叫做三角形设置,它的输入是为了下一个阶段做筹备。
5. 三角形遍历
三角形遍历阶段将会查看每个像素是否被一个三角形网格所笼罩。如果被笼罩的话,就会生成一个片元,而这样一个找到哪些像素被三角网格笼罩的过程就是三角形遍历,这个阶段也被称为扫描变换。
三角形遍历阶段会依据上一个阶段的计算结果来判断一个三角网格笼罩了哪些像素,并应用三角网格 3 个顶点的顶点信息对整个笼罩区域的像素进行插值。
6. 片元着色器
片元着色器是另一个十分重要的可编程着色器阶段,片元着色器的输出是上一个阶段对顶点信息插值失去的后果,更具体来说,是依据那些从顶点着色器输入的数据插值失去的。而它的输入是一个或多个色彩值。
这一阶段能够实现很多重要的渲染技术,其中最重要的技术之一就是纹理采样。为了在片元着色器中进行纹理采样,咱们通常会在顶点着色器阶段输入每个顶点对应的纹理坐标,然和通过光栅化阶段对三角网格的 3 个顶点对应的纹理坐标进行插值后,就能够失去其笼罩的片元的纹理坐标了。
7. 逐片元操作
逐片元操作是 opengl 中的说法,在 directx 中,这一阶段被称为输入合并阶段。
这一阶段有几个次要工作:
决定片源的可见性。波及很多测试工作,如深度测试,模板测试等。
如果一个片源通过了所有的测试,就须要把这个片源的色彩值和曾经存储在色彩缓冲区中的色彩进行合并
至此,整个 GPU 渲染管线就完结了。