Real-Time Rendering第四版 翻译(二之一):图形渲染管线 架构

821 阅读6分钟

本章节展示了名为渲染管线(rendering pipeline)实时图形的核心组件,有时也简称为管线。管线的核心功能是根据给定的虚拟的相机(camera)、三维物体、光源和其他的一些东西,生成并渲染一个二维图像。正因为这样,管线是实时渲染的底层工具。图2.1节描述使用管线的过程。物体在图像中的形状和位置是由它们的几何结构(geometry)、环境中的特征以及环境中相机的摆放(placement)决定的。而物体的外观(appearance)则受到材质(material)属性、光源、贴图(被应用于表面的图像)以及着色方程的影响。 图2.1 左边的图片中,一个虚拟的相机被放置在视锥的顶点处,只有视体(view volume)范围内的基本几何体被渲染。对于一个基于透视渲染的图形而言,视体是一个锥形。右侧的图形中能看到,视锥外的红色圆盘并未被渲染进画面,因为它处于视锥外面。

我们将解释渲染管线的不同阶段,重点关注其功能而非实现,应用这些阶段的相关细节将被包含在在后面的章节。

2.1 架构

在现实世界中,管线的概念表现出很多不同的形式,从工厂的组装线到快餐店的厨房。同样的,它也适用于图形学渲染,一个管线由几个阶段组成,每一个都表现为一个更大任务的一部分。

管线阶段是并行执行的(excute in parallel),每一个阶段取决于前一个阶段的结果(每个阶段同时都在进行,先做好的工作会被积压起来以等待后一个阶段来接收)。理想状态下,一个非管线系统被划分为n个管线阶段可以获得n倍的加速,性能提升是使用管线的最主要原因。举例来讲,通过一个人来准备面包、一个人放置肉类、另一人放置浇头的方式,可以快速准备好大量的三明治。每个人向流水线上的下一个人传递结果并且迅速开始下一个三明治的工作,如果每人花掉20秒来完成他的工作,那么一个三明治最短需要20秒就可以完成。管线的阶段被并行执行,先完成的工作成果会被搁置起来,以等待后完成的阶段完成了它的工作。举例来讲,假设添加肉类的阶段变得更加复杂,需要30秒,现在能达到的最快速度是一分钟两个三明治。对于这样一个管线,由于加肉的阶段决定了整个生产效率,它就成为了瓶颈,加浇头的阶段在等待加肉完成的时候,就成了一种饥饿的状态(对于客户来说一样)。

这种管线结构也能在计算机图形环境中找到。如图2.2所示,可以将实时渲染管线粗地划分为四个主要阶段:应用、几何处理、光栅化和像素处理。这个结构就是内核——渲染管线引擎,也就是被用在实时图形计算应用的那个,这也是为什么这部分是之后所要讨论的内容的基础。每个阶段经常内部就是一个管线,这意味着它是由多个子阶段组成的。在这里我们对功能阶段和他们实现的结构加以区分,一个功能阶段执行一个确定的任务但却没有指定在该管线中完成任务的方法,一个给定的实现可能会将两个功能阶段组合成一个单元或者使用编程核心来执行,同时将另一个更加费时的功能阶段拆分成多个硬件单元。 图2.2 渲染管线可以理解为由以下四个阶段组成:应用、几何处理、光栅化和像素处理。每个阶段可以在其内部自成一个管线,例如图中的几何处理阶段,也有些阶段内部会并行锤,例如像素处理阶段所展示的。图中的应用阶段是一个单独的过程,但这个阶段同样可以是管线或者并行。

渲染速度可以用每秒帧数(FPS)也就是每秒时间内被渲染出的图像数量来表示,也可以用赫兹(Hz)来表示,赫兹是1/seconds的一个简写符号,表示了更新的频率。另外只展示渲染图片所花费的毫秒(milliseconds)时间也是十分常见的。生成图像的时间通常是不同的,这取决于在每一帧中执行的计算的复杂性。FPS用来表示特定帧的速率,或者在运行期间的平均性能。赫兹用于硬件,如显示器,它被设置为固定速率。 顾名思义,应用阶段被应用程序驱动,因此通常由运行在通用CPU上的软件实现。这些CPU通常包含多核,有能力并行地处理多线程指令,这使得这些CPU可以高效地运行大量的应用阶段职责所在的任务。传统做法下,在CPU上执行的任务包括碰撞检测、全局加速算法、动画、物理模拟等,主要取决于应用的类型。下一个主要阶段是几何处理,涉及了包括形变(transform)、投影(projection)在内的所有几何处理。这个阶段计算了将要画什么、应该如何画、画在哪里的问题。几何阶段一般在图形处理单元(GPUs)上执行,GPUs一般包含了大量可编程核心和固定操作硬件。光栅化阶段通常接受三个组成一个三角形的顶点作为参数,找出所有被认为包含在这个三角形中的像素,并且将这些结果传递到下一个阶段。最终,像素处理阶段对每个像素执行一个程序,来确定它的颜色,并且可能执行深度检测来确定这个像素是否可见。像素处理阶段也有可能执行一些逐像素的操作类似混合新计算出的颜色和之前的颜色。光栅化和像素处理阶段同样完全执行在GPU中。所有的这些阶段以及其他们的内部管线将会在之后的四个小节介绍,需要知道更多关于GPU如何处理这些阶段的内容可以翻阅第三章。