
我们将在本文/教程中了解什么?
在上一篇文章中,我们讨论了什么是着色器及其类型。 在本文中,我们将理解为什么我们需要两个最基本的着色器才能在屏幕上绘制网格-Vertex 着色器和Pixel 着色器 ,以及这两种类型的着色器如何在着色/渲染管道中工作。

每个数据包/数据包都包含有关顶点的信息,在最基本的情况下,该信息是顶点的位置值。 它也可以包含顶点的颜色或法线值。 该信息包被发送到顶点着色器。

顶点着色器充当处理机,按照指令处理在每个数据包内部发送的数据。 顶点着色器完成顶点数据的处理后,它以称为“ 顶点输出”的另一个数据包的形式提供处理后的信息。

顶点输入至少应具有顶点位置数据的方式。 同样,“ 顶点输出”也应该已经处理了顶点位置数据,该数据随后将传递给Rasterizer 。
通常,顶点着色器将对象空间位置值转换为顶点的投影空间位置值。 如果您不了解对象空间和投影空间的值,那么不必担心,我们将在以后的文章中介绍它。
在“顶点”着色器中,我们还可以操纵顶点的位置,例如:若要创建标记着色器,我们可以基于正弦波函数制作标记波的网格。

然后,“顶点输出”将转到Rasterizer ,这是一种硬件,它可以根据网格顶点的位置确定要覆盖屏幕的哪些像素,以便在屏幕上绘制网格。 在其他Rasterizer中,确定哪些像素将位于几何区域内。

栅格化规则确定哪些像素将被几何覆盖,这些规则之一是采样。 在采样过程中,为每个像素提供一个样本。

当光栅化器使用采样过程找出被几何区域覆盖的像素时,每个像素都被赋予一个样本,并且光线从样本点的位置通过。 如果光线照射到几何体,则意味着像素将被几何体覆盖,或者将在几何区域内。
栅格化器的另一个作用是为顶点之间的像素插值数据。 让我们花一点时间来理解数据插值的含义。
插值:
如果我们有一个三角形并且这次包含位置信息,我们还将在顶点输入中打包该顶点的法线信息。 经过顶点着色器后,Rasterizer将接收每个顶点的法线信息,并确定当在屏幕上绘制三角形时,网格覆盖了屏幕的哪些像素,Rasterizer还将提供法线值给每个像素基于每个顶点读取的正常值。
例如:

如果这是三角形,则这是顶点的法线值。
首先,我们讨论这两个顶点的插值,以找出位于此线中心(由两个顶点组成)的像素的插值法线值。
顶部顶点的x正常值为0,底部顶点的x正常值为1,因此中心的x正常值为0.5

类似地,上顶点的y正常值为— 1,下顶点的y正常值为— 0,因此中心的x正常值为0.5
这就是为什么位于此线中心的像素的正常值将为-(0.5,0.5,0)。 以这种方式,每个像素的正常值将由光栅器计算。
此时,Rasterizer已经确定了屏幕的哪些像素将被几何区域覆盖,并且每个像素都有自己的插值。
对于每个确定的像素,将执行“片段/像素”着色器。 “顶点输出”(Vertex-output),即从顶点着色器发出的信息包,然后传递给Rasterizer,该信息包被传递给Fragment / Pixel Shader。

片段/像素着色器将按照指示处理信息,并输出像素的颜色和alpha值,这些颜色和alpha值最终将导致屏幕上的最终像素颜色。
在我的下一篇文章中,我将分享有关着色器组件的更多信息。 同时,您可以观看我的着色器开发系列教程:使用Unity 5进行着色器开发,可从以下网站获得:
- Teachable.com
- Cgcircuit.com
这是youtube上的完整预览播放列表:Shaderguide或Youtube
谢谢!
Chayan Vinayak Goswami