Chapter 3 – The Graphics Processing Unit

3.5 顶点着色器

顶点着色器是管线的第一个阶段。它也是第一个直接由程序员控制的管线阶段。在DX中有一个位于顶点着色器之前的阶段,其被称为输入装配器(input assembler),多组数据流将一同形成几组顶点与图元,并被传输至管线。例如,一个物体拥有一组位置数据与颜色数据。输入装配器会按照位置信息与颜色信息创建顶点,以此创建物体的三角形。第二个物体可能还会使用相同的位置(使用不同的模型转换矩阵)和不同的颜色信息。我们将在第十六章再详细讨论数据的类型。输入装配其还支持instancing。这一技术允许同一物体以不同的数据被绘制多次,但只需要一个draw call。在第十八章中我们将学习如何使用instancing技术。

三角形网格模型由一组定点组成,每个顶点在模型表面都有确定的位置。除了位置信息,每个顶点还拥有其他属性,例如,颜色或者贴图坐标。物体表面的法线也可能定义在网格模型的顶点中,当然现在大多使用法线映射贴图。数学意义上,每一个三角形都拥有一个表面法线,可能大家会觉得我们应该使用三角形的发现直接计算光影效果。但是,在我们绘制模型时,三角形的网格一般用于表示带有弧度的表面,顶点的法线则表示这一表面的朝向。在第十六章中,我们将会讨论如何计算顶点的法线。

顶点着色器是第一个处理三角形网格的阶段。顶点着色器并不能拿到具体的三角形的数据。顶点着色器只会处理输入的顶点。顶点着色器提供了一种方法能够修正,创建,或者忽略与每个三角形的顶点相关联的数据,例如,顶点的颜色,法线,贴图坐标,以及位置。一般来说,顶点着色器会将顶点从模型空间转换至齐次剪裁空间。

顶点着色器非常类似于我们之前说的统一着色器。每一个输入的顶点都会由顶点着色器处理,之后一组数据用于之后的三角形插值。顶点着色器不能创建或者销毁顶点,一个顶点的值不能传入另一个顶点。由于每一个顶点都是独立处理的,GPU中任何数量的着色器处理器都能够并行处理输入的顶点。

输入装配一般被描述为一个发生在顶点着色器之前的一个处理过程。其实并不如此,这就是我们之前提到的管线的物理模式与逻辑模式的不同。事实上,读取数据并创建顶点的操作发生在顶点着色器中,同时驱动会使用合适的指令来预处理每一个着色器。

之后的章节会继续介绍一些顶点着色器所能达到的效果,例如动画节点的顶点融合,轮廓渲染。其他一些顶点着色器的使用:

  • 创建一个网格模型,通过顶点着色器使其变形。
  • 使用蒙皮与变形技术驱动角色的身体动画与面部动画。
  • 程序化的变形,例如布料模拟,水面模拟。
  • 粒子系统,将非区域型的网格转换为区域性的网格。
  • 镜头的变形,热气,水波,卷纸,以及其他将framebuffer作为贴图进行程序化变形的效果。
  • 使用顶点贴图来设置地形的高度。

有多种使用顶点着色器的输出结果的方法。通常情况下,输出结果将被用于生成每个instance的图元并且被光栅化,独立的像素块将被传输至像素着色器程序进一步处理。有些GPU可以讲输出的数据传输至tessellation阶段或者几何着色器或者将结果存储在内存中。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据