Chapter 2 – The Graphics Rendering Pipeline 图形渲染管线

本章节将为大家讲述图形学中实时渲染的核心部分,一般来说,我们将其称之为渲染管线,有时候我们也会将其简称为“管线”。而管线的主要用途就是基于一个虚拟的camera,将三维场景中的三维物体,光源和各种对象绘制到一张二维的图像中。而这些物体在二维图像中所展现的位置与形状则由物体的几何形状,环境的特性与camera在环境中的位置所决定。而这些物体的外观表现则会被其材质属性,光源,贴图(应用于物体表面的图像)以及阴影计算模型所决定。

在本章节中,我们将会解释渲染管线中各个阶段的用途,而各个阶段的实现与应用将在之后的章节中呈现。

2.1 结构

在现实世界中,在各个领域都会运用“管线”这一概念,例如工厂的流水线或者开封菜与金拱门的后厨生产流程。而这一概念同样会运用于图形学中的渲染。一个管线会有多个阶段所组成,每个阶段都负责执行一整个任务的一部分。

管线中各个阶段所执行的工作都是“平行”的,但是每个阶段又会依靠上一个阶段的处理结果。理论上如果将一个非管线的系统划分为n个管线阶段,那么我们将获取n倍的速度提升。例如,我们需要准备许许多多的三明治,那么如果一部分人准备面包,另一部分负责加肉,另一部分则负责加蔬菜。每一个人都会将处理结果输送给“管线”中的下一个人,之后立刻处理下一个三明治。如果每个人需要20秒来完成自己的任务,那么制作每个三明治最少需要20秒。管线的各个阶段虽然平行运作,但是直到最慢的阶段完成手头的任务之前其它阶段都将处于闲置状态。例如,上一个例子中,加肉的处理需要30秒。那么现在制作每个三明治最少需要30秒。也就是说对于例子中的管线来说,加肉这个阶段就是其瓶颈,因为这个阶段决定了整个流程的速度。

这一类型的管线结构也应用于计算机图形学中的实时渲染。我们可以将实时渲染管线粗略地划分为四个主要阶段——应用(application)几何处理(geometry process)光栅化(rasterization)以及像素处理(pixel process),如下图所示。

这个结构就是渲染管线的核心,其广泛地运用于计算机实时渲染的应用中,因此这也是我们本章节所要学习的基础。这四个阶段的每一个阶段自身也是一个管线,换句话说每个阶段由多个子阶段组成。我们将区分功能性阶段(functional stage)与他们各自的实现结构(structure of implementation)。所谓功能性阶段,我们将列举出每个阶段需要执行的任务,但并不会提及如何在管线中执行这个任务。

我们通过FPS(frame per second)来表示渲染的速度,其代表每一秒绘制图像的数量。其也可以由Hertz(Hz)表示,也就是刷新的频率。一般来说,我们会以毫秒(ms)作为计量渲染时间的单位。而生成一张图像所需要的时间则取决于每一帧计算的复杂程度。FPS既可以作为某一帧的频率也能作为一段时间内的性能。而Hertz一般运用于硬件,例如显示器。

应用阶段主要由应用所驱动,因此其主要由软件执行并运行于CPU。CPU一般会包含多个核心,其能够平行处理多个线程。这一特性让CPU能够有效地运行各种不同的任务,并且负责渲染关系的应用阶段。有一些任务一般由CPU负责,例如碰撞检测,全局加速算法,动画,物理模拟等等。而下一个主要阶段就是几何处理阶段,它将负责空间的转换,投影以及其他各种几何任务。这一阶段将会计算,什么将被绘制,如何被绘制以及应该被绘制在哪里。几何处理阶段将运行于GPU,其包含了许许多多的可编程核心。光栅化阶段则将输入的三个顶点构成一个三角形,并且找到所有位于这个三角形内部的像素,之后将这些数据传入下一个阶段。最后,像素处理阶段将会为每个像素执行一个程序用以决定像素的颜色,同时其还会执行深度测试以检测该像素是否可见。此外,该阶段还会为每个像素进行其他处理,例如将像素之前的颜色与新计算的颜色进行融合。光栅化与像素处理阶段都完全由GPU扶着。所有这四个阶段以及其他们各自对应的内部管线将在之后的四个章节进行讨论。我们将在第三章中展示GPU是如何处理这些阶段的。

留下评论

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