这个系列是GAMES106-现代图形绘制流水线原理与实践(GAMES 106: Intro to Modern Rendering Pipeline)的同步课程笔记。课程内容涉及现代图形绘制流水线的基础原理,实践方法,以及优化技巧。本节课主要介绍绘制流水线的概念和发展历程。
图形绘制
渲染或者说图形绘制(rendering)是研究如何利用计算机来生成图像的学科。在制造业、影视行业、游戏行业、艺术设计以及科学数据的可视化等各种场景中,图形绘制都有着大量的应用。

在这些不同应用场景中负责图形绘制的软件称为绘制引擎。根据不同应用场景的需要,不同的绘制引擎往往有着相应的侧重点。

在绘制引擎的底层我们还需要各种计算和显示硬件的支持

而在绘制引擎与硬件之间则需要绘制流水线进行沟通,它涉及到图形算法、硬件规范等等。某种意义上讲,我们可以把绘制流水线当做绘制引擎的后端,我们需要通过绘制流水线来控制硬件执行图形绘制。


当我们需要设计新的图形算法或者实现新特效时,我们就大概率需要和绘制流水线来打交道。在算法层面外,学习绘制流水线还需要对硬件有一定的认识,很多对实时性有要求的场景都依赖于定制的绘制流水线。如何提升绘制流水线的性能也是产业和学术界的一个热点。











认识绘制流水线
固定绘制流水线
从宏观来看,绘制流水线的输入包括场景的几何、纹理和光照信息,而它的输出则是场景的图片。

可编程绘制流水线
随着GPU技术的发展,现代绘制流水线在经典绘制流水线的基础上还添加了大量的可编程着色器用来实现更加丰富的功能。

常见的可编程流水线一般包括如下功能:
- Vertex/Index Buffer: 读取三角形顶点位置和连接关系
- Input Assembles: 将读取到的三角形顶点信息组装成三角面片
- Vertex Shader: 将三角形的顶点坐标变换到相机坐标系下
- Rasteriation: 把三角面片投影到屏幕空间上并进行像素化
- Fragment Shader: 根据纹理和光照信息计算每个三角面片的着色
- Color Blending: 对不同通道的颜色进行混合
- Frame Buffer: 存储计算得到的图片并输出到显式设备中

整个流水线中有些组件的功能是非常固定的,硬件厂商已经对它们进行了大量的优化我们也基本无需进行更多的修改,而各种shader则允许进行各种定制以实现不同的显示效果。

本课程会根据现代绘制流水线的各个流程逐一介绍相关的技术。



绘制流水线的演变
接下来我们介绍绘制流水线是如何一步步发展到今天这种形式的。
经典绘制流水线
从原理上来看,我们只需要CPU就可以实现完整渲染过程,这样的程序一般称为软光栅。和CPU相比GPU更擅长做大量的并行计算,因此GPU被用来执行流程相对固定的绘制程序从而诞生了经典绘制流水线,其核心是由CPU准备计算所需的各种资源并分配到GPU上执行实际的计算。

为了方便控制绘制流水线,人们设计开发了早期的图形API并逐步形成了图形行业标准,这一时期的代表是1992年发布的OpenGL 1.0。


后来逐步出现了可编程绘制语言,人们可以在此基础上实现更加复杂的光照和显示效果。这一时期来自微软的DirectX在市场竞争中占据了大量的优势,DirectX开始成为图形开发的首选。

随着几何着色器和曲面细分技术的出现,人们可以通过GPU来直接修改几何对象从而实现更加真实的渲染效果。


可以说以OpenGL及其生态为代表的图形API构成了经典绘制流水线。

现代绘制流水线
现代绘制流水线一般是指以Vulkan为代表的现代图形API。和OpenGL相比,Vulkan允许开发者直接对底层GPU进行编程从而获得更高的运行效率。


而本门课程也会基于Vulkan来介绍现代绘制流水线的相关技术。

未来
这几年随着硬件性能的提升,在传统光栅化的基础上产生了结合光线追踪的混合绘制流水线。这样的混合绘制流水线对于光线的反射和折射有着更好的表现效果。

结合各种AI的渲染技术也可能会对未来的绘制流水线产生深远的影响。




