Skip to content

门泊吴船亦已谋

Vulkan 画三角形 第八章 图形流水线介绍

接下来的文章我们将会配置图形流水线来绘制我们的三角形。图形流水线就是一系列的操作,这些操作把我们的网格体中的顶点和纹理转换成渲染目标上的像素点

下面是一个简化的概述

  • 输入装配
    从我们指定的缓冲区中收集原始的顶点数据,也可能使用索引缓冲来复用某些元素而不是重复顶点数据本身
  • 顶点着色器
    遍历每一个顶点,通常是对顶点应用一个变换把顶点位置、法线等属性从模型空间转换到屏幕空间。它也会把每个顶点数据顺着流水线传递下去
  • 细分着色器
    我们能够基于某些规则细分几何体来提高网格质量。通常用于砖墙、楼梯等表面,使它们看起来不会太平
  • 几何着色器
    遍历每一个图元(三角面、边、点),可以排除它或者添加更多的图元。这一点与细分着色器类似,但是更加的灵活。然而在如今的应用中它已经不那么常用,因为它的性能在大多数显卡上都较差,除了因特尔的集成显卡
  • 光栅化
    把图元离散化为片元。片元就是填充在帧缓冲上的像素元素。任何一个脱离屏幕外的片元都会被忽略。顶点着色器输出的属性值也随着片元逐一插值。通常位于其他图元的片元之后的片元也会被忽略,因为深度测试
  • 片元着色器
    遍历每一个存活的片元,并且决定片元的颜色和深度值将会写入哪一个帧缓冲区中。它之所以能够这样是因为使用了插值后的顶点着色器的数据,包括纹理坐标、法线等
  • 颜色混合
    允许对帧缓冲区中同一个像素上的不同的片元进行混合。片元可以简单的覆盖,直接相加,或者基于透明度进行混合等

输入装配、光栅化、颜色混合阶段是固定功能阶段,这些阶段允许你使用参数微调它们的操作,但是它们工作的方式是预定义的

其他阶段就是可编程的,这意味着我们可以传入自己的代码到显卡来精确地应用你想要的操作。比如它能够允许你使用片元着色器来实现贴图、光照乃至光追等任何东西。这些程序会在多个 GPU 核心上同时处理,比如并行处理各个顶点、片元等

如果你之前使用过 OpenGL 或者 Direct3D 等旧的图形 API,你可能会习惯于能够修改流水线的配置。而 Vulkan 中的流水线几乎完全是不可更改的,所以如果想要修改着色器,绑定不同的帧缓冲区或者修改混合函数,你必须从头开始重新创建流水线。这样的缺点是你将会不得不创建大量的流水线,分别代表你想要在渲染操作中用到的状态的不同组合。然而由于你要在流水线中要做的操作都已经预先定义好,驱动能够更好地对它进行优化

某些可编程阶段是可选的。例如细分和几何着色器可以被禁用,如果你只是想绘制简单几何体的话。如果你只关心深度信息,那么你可以禁用片段着色器阶段,这对阴影贴图的生成很有用