大家好,今天来为大家解答深入解析图形学核心:渲染管线原理与技巧这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
图2.1。
在左图中,虚拟相机放置在金字塔顶部(四条线相交的地方)。只有视觉体积内的图元才会被渲染。因为图像是通过透视投影渲染的(就像这里的情况一样)。观察体是一个视锥体,一个带有矩形底座的截棱锥体。右图显示了相机可以看到的所有内容。请注意,左图像中的红色甜甜圈形状的对象未在右图像中渲染,因为它位于视锥体之外。左图中扭曲的蓝色棱镜状物体被视锥体顶部的平面截断。
2.1 架构
在现实世界中,管道的概念以多种不同的方式体现,从工厂的装配线到将滑雪者运送到山上的起重机。它还用于图形渲染领域。管道通常包含多个阶段。例如,在输送石油的管道中,第一级的油在第二级的油进入第三级之前不能进入第二级。这意味着管道的速度取决于最慢的阶段,而不考虑其他阶段。快的。
理想情况下,如果将一个非流水线系统分为n个流水线级,速度将提高n倍。性能提升是使用管道的主要原因。例如,只有一把椅子的雪橇升降机效率低下;添加更多的椅子可以按比例增加运送到山上的滑雪者的数量。尽管管道的各个阶段是并行执行的,但其他阶段会停止,直到最慢的阶段完成其工作。例如,如果汽车装配线上方向盘附件的装配阶段需要3分钟,而其他所有阶段只需要2分钟,那么可以达到的最佳完成速度是每三分钟一辆汽车;在方向盘安装完成之前,其他阶段需要等待一分钟。对于这种流水线来说,方向盘装配阶段是整个流水线的瓶颈,因为它决定了整个生产流程的速度。这种流水线结构也存在于计算机实时图形渲染中。实时渲染管线大致可分为三个阶段:应用阶段、几何阶段、光栅化阶段,如图2.2所示。
图2.2。渲染管线的基本结构,包括三个阶段:应用阶段、几何阶段、光栅化阶段。每个阶段本身可能就是一个管道,就像下面所示的几何阶段一样。一个阶段可以是(部分)并行化的,就像下面所示的光栅化阶段一样。在此示例中,应用程序阶段是单个进程,但该阶段也可以是管道化或并行化的。该结构是渲染管线引擎的核心机制——它用于计算机实时图形应用,因此它是后续章节讨论的重要基础。每个阶段本身通常是一个管道,这意味着它由许多子阶段组成。我们区分概念阶段(应用阶段、几何阶段和光栅化阶段)、功能阶段和管道阶段。功能阶段指定运行特定任务,但不指定任务在管道中的执行方式。另一方面,管道阶段与其他管道阶段同时运行。对于高性能要求,管道阶段也可以并行运行。例如,几何阶段可能分为5个功能阶段,但图形渲染系统的实现决定了它分为流水线阶段。给定的实现可以将两个功能级组合成单个流水线级,并且耗时的功能级也可以被划分为一系列流水线级或者甚至并行化。最慢的管道阶段决定了渲染速度和图像更新率。该速度可以用帧速率(fps) 来表示,帧速率是每秒渲染的图像数量。也可以用更新频率来表示——赫兹(Hz),单位是1/秒。应用程序生成图像所需的时间通常会有所不同,具体取决于对每个图像帧执行的计算的复杂性。帧速率表示某一帧的速率或一段时间内的平均速率。赫兹单位用于硬件中,例如设置为固定速率的监视器。由于我们正在处理管道,因此简单地将通过整个渲染管道来渲染我们需要的数据所需的时间相加是不够的。当然,这是管道结构的结果,它允许各个阶段并行执行。如果我们可以找到瓶颈(管道中最慢的阶段)并测量通过该阶段所需的时间,那么我们就可以计算渲染速度。例如,假设执行瓶颈阶段所花费的时间为20ms;那么渲染速度将为1/0.020=50 Hz;否则,实际输出速度会较慢。在其他管道环境中,使用术语“吞吐量”而不是渲染速度。
示例:渲染速度。假设我们的输出设备的最大更新频率是60HZ,渲染管线的瓶颈已经找到。执行该瓶颈阶段所花费的时间为62.5ms。然后渲染速度计算如下。首先,忽略输出设备,我们可以获得的最大渲染速度是1/0.0625=16 fps。第二步,调整这个值到输出设备的频率:60HZ表示渲染速度可以是60赫兹,60/2=30赫兹,60/3=20赫兹,60/4=15赫兹,60/5=12 Hz 等这意味着我们可以预期15HZ 的渲染速度,这是输出设备可以在低于16 fps 的情况下管理的最大恒定速度。
顾名思义,应用程序阶段是应用程序驱动的,因此在通用CPU 上运行的软件中实现。这些CPU 通常包含多个内核,并具有多个并行处理线程。这使得CPU能够高效地运行其在应用程序阶段负责的大量任务。传统上在CPU 上执行的一些任务包括碰撞检测、全局加速算法、动画、物理模拟等,具体取决于应用程序的类型。下一个阶段是几何阶段,其任务是几何变换和投影等。这个阶段计算要画什么、如何画、应该画在哪里。几何阶段通常在图形处理单元(GPU)上执行,该单元包含许多可编程内核以及一些固定操作硬件。最后,光栅化阶段利用前一阶段生成的数据来计算所需的像素,最终绘制(渲染)图像。光栅化阶段完全在GPU 上执行。这些阶段及其内部管道将在接下来的三节中讨论。
2.2 应用程序阶段
由于应用程序阶段在CPU上运行,因此开发人员可以完全控制应用程序阶段发生的所有事情。因此,开发人员完全可以决定如何实现并在以后进行修改以提高性能。这里的更改也会影响后续阶段的性能。例如,应用程序阶段的算法或设置可以减少渲染的三角形的数量。在应用阶段结束时,要渲染的几何图形被输入到几何阶段。这些几何图形正在绘制点、线和三角形等基元,这些基元最终可能会显示在屏幕上(或由输出设备使用)。这是申请阶段最重要的任务。该阶段基于软件的结果是,它不会像几何阶段和光栅化阶段那样分为多个子阶段。然而,为了提高性能,此阶段通常跨多个线程或核心并行执行。在CPU设计中,这被称为超标量架构,因为它可以在同一阶段同时执行多个进程。此阶段通常执行的过程是碰撞检测。当检测到两个物体之间发生碰撞后,就会产生反应并发送到碰撞物体和力反馈装置。应用程序阶段也是处理来自键盘、鼠标、头盔等设备的输入的地方。根据此输入,会做出不同的响应。在此阶段期间实现的其他过程包括纹理动画、位置动画或在此阶段期间未执行的任何其他计算。
2.3 几何阶段
几何阶段负责大多数图元到图元和顶点到顶点的操作。该阶段进一步分为以下功能阶段:模型和视图更改、顶点着色、投影、裁剪和屏幕映射(图2.3)。再次注意,根据实现的不同,这些功能阶段可能相当于也可能不相当于管道阶段。在某些情况下,一系列连续的功能阶段被组合成单个管道阶段(与其他管道阶段并行运行)。在其他情况下,功能级可以分为多个较小的流水线级。
图2.3 几何阶段被细分为由多个功能阶段组成的管道。例如,在一种极端情况下,整个渲染管线的所有阶段都可能以软件方式运行在单个处理器上,那么你可以说你的整个管线只包含一个管线阶段。当然,这就是在单独的图形加速器芯片和显卡出现之前生成图形的方式。在另一个极端,每个图形阶段可以细分为多个更小的流水线阶段,并且每个这样的流水线阶段可以在指定的处理器核心元件上执行。
2.3.1 模型及视图变换
模型在渲染到屏幕上之前会转换为几个不同的空间或坐标系。最初,模型位于其自己的模型空间中,这仅仅意味着它根本没有被转换。每个模型都可以与模型变换关联以对其进行定位和定向。这允许同一模型的副本(称为实例)在同一场景中具有不同的位置、方向和大小,而无需复制底层几何体。模型变换会变换模型上的顶点和法线。物体的坐标系称为模型坐标系。当模型变换应用于对象的坐标系时,模型处于世界坐标系或世界空间中。世界空间是唯一的,所有模型在使用相应的模型变换进行变换后都位于同一空间中。
如前所述,只有相机(或观察者)看到的模型才会被渲染。相机在世界空间中具有位置和方向,用于放置和对齐相机。为了方便投影和裁剪,相机和所有其他模型都使用视图变换进行变换。视图更改的目的是将相机放置在原点并将其对齐,使其朝向负Z 轴,Y 轴指向上方,X 轴指向右侧。视图转换后的实际位置和方向取决于底层应用程序编程接口(API)。
因此,这个空间所描述的称为相机空间,或更笼统地说,称为透视空间。图2.4 显示了影响相机和模型的视图变换的示例。所有模型变换和视图变换均由44矩形阵列实现。
图2.4 左图中,相机的位置和方向与用户想象的一样。视图变换将相机重新定位到原点,沿负Z 轴定向,如右图所示。这种方法使裁剪和阴影变得更容易、更快捷。浅灰色区域是可见体积。这里假设透视投影视图,因为观察体积是视锥体。相同的技术可以应用于任何类型的投影。
2.3.2 顶点着色
为了生成真实的场景,仅仅渲染物体的位置和形状是不够的,还需要模拟它们的外观。这些描述包括每个物体的材质以及光源对物体的影响。材质和灯光可以通过多种方式进行模拟。包括最简单的颜色到复杂的物理效果。
决定光对材质的影响的操作称为着色。它涉及物体上各个点的着色方程的计算。通常,这些计算中的一些将在每顶点几何阶段中执行,而其他计算可以在每像素光栅化阶段中执行。每个顶点中可以存储各种材质数据,例如点的位置、法线、颜色或计算着色方程所需的其他数值信息。然后,顶点着色的结果(可以是颜色、矢量、纹理坐标或任何其他类型的着色数据)被发送到光栅化阶段进行插值。
着色计算通常被认为是在世界空间中执行。在实践中,有时将相关实体(例如摄像机和灯光)转换到其他空间(例如模型或视觉空间)并在那里执行计算会更方便。因为如果将着色计算中包含的所有实体对象都变换到同一个空间中,则光源、相机、模型的相对关系是一致的。
2.3.3 投影
着色后,渲染系统将执行投影操作,将视觉体积转换为单位立方体。该单位立方体的最小点和最大点分别为(1,1,1) 和(1,1)。1).单位立方体称为规范体积。常用的投影方法有两种,正交投影(又称平行投影)和透视投影。如图2.5所示
图2.5。左图是正交投影,或者说是平行投影;右图是透视投影
正交视图的视觉体积通常是一个矩形框,正交投影变换将视觉体积转换为单位立方体。正射投影的主要性质是平行线变换后仍保持平行。这种变换是位置变换和尺度变换的组合。透视投影稍微复杂一些。在这种类型的投影中,物体距离相机越远,投影后看起来越小。除此之外,平行线将在地平线上汇聚。通过这种方式,透视变换模拟了我们对物体大小的感知。从几何学上讲,视觉体积称为视觉平截头体,是一个具有矩形底座的截棱锥体。平截头体也将转变为单位立方体。可以使用44矩阵构造正交变换和透视变换,并且经过任何变换后,模型被认为处于规范设备坐标系中。尽管这些矩阵变换从一种视觉体积变换到另一种视觉体积,但它们仍然称为投影。因为显示完成后,图片中不再保存Z坐标。这样,模型就从三维空间投影到二维空间。
2.3.4 裁剪
只有完全或部分位于视觉体积内的图元才会传递到光栅化阶段,该阶段将它们绘制到屏幕上。完全在视觉体积内的图元将被传递到下一阶段。完全在视觉体积之外的图元不会传递到下一阶段,因为它们不会被渲染。视觉体内的一些图元需要被剪裁。例如,一个顶点在视口之外而另一个顶点在视口内的线段将被视口剪切,因此外部的顶点将被线段与视口相交处的顶点替换。使用投影矩阵意味着变换后的图元将被单位立方体裁剪。在裁剪之前进行视图变换和投影变换的优点是裁剪问题更加一致;图元总是被单位立方体剪切。图2.6描述了裁剪过程。除了视觉体积的六个剪切平面之外,用户还可以定义其他剪切平面来显式剪切对象。与通常由可编程处理单元执行的先前几何阶段不同,剪切阶段(以及随后的屏幕映射阶段)通常由固定操作硬件处理。
图2.6。投影更改后,只有单位立方体内的图元(对应于视锥体内的图元)将继续被处理。因此,立方体外部的图元将被丢弃,而完全位于立方体内部的图元将被保留。与立方体相交的图元将被立方体剪切,因此将生成新顶点并丢弃旧顶点。
2.3.5 屏幕映射
只有在视觉体积内(剪辑)的图元才会传递到屏幕映射。阶段,进入该阶段时坐标仍为三维。每个图元的x 和y 坐标都会转换为屏幕坐标。屏幕坐标和Z坐标的组合也称为窗口坐标。假设场景要渲染成一个窗口,这个窗口的最小角度是(x1,y1),最大角度是(x2,y2),并且X1 图2.7 图元经过投影变换后位于单位立方体中,屏幕映射负责寻找屏幕上对应的坐标。一个困惑是整数和浮点点值如何与像素(纹理)坐标相关。 DirectX 9 及其前身使用像素中心为0.0 的坐标系,这意味着[0, 9] 范围内的像素覆盖[-0.5, 9.5] 的跨度。 Heckbert [520] 给出了一种理论上更加一致的策略。给定水平像素数组并使用笛卡尔坐标,最左侧像素的左边缘在浮点坐标中为0.0。 OpenGL一直使用这种策略,DirectX10及其后继者也使用这种方法。中心的像素为0.5。因此[0, 9] 范围内的一系列像素覆盖了[0.0, 10.0] 范围。换算公式如下: d=下限(c), (2.1) c=d +0 .5, (2.2) d 是离散(整数)像素索引,而c 是连续(浮点)像素值。虽然所有API的像素位置值都是从左到右递增,但是OpenGL和DirectX对于零点的位置是位于上边缘还是下边缘的问题是不一致的。 OpenGL更喜欢笛卡尔坐标系,将左下角设置为具有最低值的点,而DirectX有时将左上角定义为该点,具体取决于周围环境。每种做法都有其背后的逻辑,其差异没有正确答案。例如,在OpenGL 中,(0,0) 位于图像的左下角,而在DirectX 中,它位于图像的左上角。 DirectX采用这种方式的原因是,屏幕上的很多现象都是从上到下的:微软的窗体使用这个坐标系,我们读取的顺序,以及各种图像格式存储缓冲数据的方式。重要的是,差异是真实存在的,从一种API 切换到另一种API 时应该考虑到这些差异。2.4 光栅化阶段
给定变换和投影的顶点及其关联的着色数据(均来自几何阶段),光栅化阶段的目标是计算和设置对象对象覆盖的像素的颜色。这个过程称为光栅化或扫描变换,它将屏幕空间中的二维顶点(所有顶点包含Z值、深度值和各种相关的着色信息)转换为屏幕上的像素。
图2.8。抛光阶段被细分为管道的几个功能阶段。
与几何阶段类似,该阶段分为几个功能阶段:三角形创建阶段、三角形遍历阶段、像素着色阶段和融合阶段(图2.8)。
2.4.1 三角形建立阶段
在此阶段,将计算三角形表面和其他数据的差异。该数据用于几何阶段生成的各种着色数据的扫描转换和插值。此过程在具有专用于该作业的固定操作的硬件上执行。
2.4.2 三角形遍历阶段
在此阶段,检查三角形是否覆盖每个像素的中心,并为与三角形重叠的像素部分生成片段。查找哪些样本或像素位于三角形内通常称为三角形遍历或扫描转换。三角形片段的属性是通过使用三角形的三个顶点的插值数据来生成的。每个三角形片段的属性是通过使用三角形的三个顶点的插值数据来生成的。这些属性包括片段的深度以及从几何阶段传递的其他着色数据。 Akeley、Jermoluk 和Rigers 提供了有关三角形遍历的更多信息。
2.4.3 像素着色阶段
此处,插值着色数据用作输入来执行逐像素着色计算。最终结果是一种或多种颜色被传递到下一阶段。与通常在专用硬件上执行的三角形构建和三角形遍历阶段不同,像素着色阶段由可编程GPU 内核执行。这里可以使用多种技术,其中最重要的技术之一是纹理映射。简而言之,纹理映射将图像附加到该对象。图2.9 描述了这个过程。图像可以是一维、二维或三维,其中二维图像的使用更为常见。
图2.9。左上角的图片显示的是没有纹理的龙。图像纹理粘在龙的身体上,结果如左下图所示。
2.4.4 融合阶段
存储颜色缓冲区中每个像素的信息,它是一个颜色矩形数组(每种颜色包含红色、绿色和蓝色分量)。融合阶段的任务是将像素着色阶段生成的片段颜色与当前存储在颜色缓冲区中的颜色合并。与像素着色阶段不同,执行此阶段的GPU 子单元通常不完全可编程。然而,它是高度可配置的,允许多种效果。
该阶段还负责解决可见性计算。这意味着当整个场景被渲染后,颜色缓冲区应该包含场景中从相机角度可见的图元的颜色。对于大多数图形硬件来说,这项工作是由Z 深度缓存算法完成的。 Z 深度缓冲区具有与颜色缓冲区相同的形状和大小,并且对于每个像素,它存储从相机到最接近相机的图元的Z 值。这意味着当图元渲染到某个像素时,会计算其图元像素的Z 值,并将其与Z 深度缓冲区中相同像素的内容进行比较。如果新的Z 值小于Z 深度缓冲区中的z 值,则将渲染的图元将是距离相机较近的图元。因此,像素的z 值和颜色将根据正在绘制的图元的z 值和颜色进行更新。如果计算出的z值大于Z深度缓冲区中的z值,则颜色缓冲区和Z深度缓冲区将保持不变。 Z深度缓存算法非常简单,其收敛性为O(n)(n是要渲染的图元数量),并且它适用于所有渲染图元,每个(相关)像素的z值可以是计算出来的都是有效的。另请注意,该算法允许以任何顺序渲染大多数基元,这就是它流行的原因。然而,部分半透明的图元不能以任何顺序渲染。它们必须在渲染所有不透明图元之后渲染,并且按照从后到前的顺序。这是Z 深度缓存的另一个主要弱点。我们已经注意到,颜色缓冲区用于存储每个像素的颜色,Z深度缓冲区用于存储每个像素的深度z值。
但是,还有其他通道和缓冲区可用于过滤和捕获有关片段的信息。 Alpha 通道与颜色缓冲区相关联,并存储每个像素的相关不透明度值。在执行Z 深度测试之前,可以对传入片段运行可选的alpha 测试。将片段的alpha 值与参考值进行比较并进行一些特定测试(例如等于、大于等)。如果片段未通过测试,则不会对其进行进一步处理。此测试通常用于确保完全透明的片段不会影响Z 深度缓存。
模板缓存是一个离屏缓存,用于记录渲染图元的位置。模板缓存通常每个像素占用8 位。可以使用多种方法将图元渲染到模板缓冲区中,然后可以使用缓冲区的内容来控制渲染到颜色缓冲区和Z 深度缓冲区中。例如,假设已将填充环渲染到模板缓存中。这可以与允许仅在圆圈出现的地方渲染后续图元的操作相结合。模板缓存是生成特效的强大工具。管道末端的所有这些方法称为光栅化操作或融合操作。
帧缓冲区通常包含系统的所有缓冲区,但有时也用来指颜色缓冲区和Z 深度缓冲区的集合。 1990年,Haeberli和Akeley[474]提出了另一种对帧缓冲区的补充,称为累积缓冲区。在这个缓存中,图像通过一系列操作来累积。例如,为了生成运动模糊效果,可以累积并平均显示对象运动的一系列图像。可以生成的其他效果包括:景深、抗锯齿、软阴影等。
当图元到达并通过光栅化阶段时,那些从相机角度可见的图元将显示在屏幕上。屏幕显示颜色缓冲区的内容。为了防止人们看到图元被光栅化并发送到屏幕,使用了双缓冲。这意味着场景在后台缓冲区中渲染到屏幕外。一旦场景在后台缓冲区中渲染完毕,后台缓冲区的内容就会与之前显示在屏幕上的前台缓冲区的内容进行交换。交换发生在垂直回扫期间,此时执行此操作是安全的。
2.5 管线纵览
点、线和三角形是构成模型或对象的渲染基元。想象一下,用户正在使用交互式计算机辅助设计系统来审查手机的设计。在这里,我们将遵循这个模型贯穿整个图形渲染管道,包括三个主要阶段:应用阶段、几何阶段和光栅化阶段。使用透视投影将场景渲染到屏幕上。在这个简单的示例中,手机模型引入了直线段(以显示边缘)和三角形(以显示表面)。三角形的一部分将键盘和屏幕表示为2D 图像纹理贴图。在这个例子中,除了纹理贴图的应用发生在光栅化阶段之外,着色计算全部在几何阶段完成。
2.5.1应用程序阶段
CAD 应用程序允许用户选择和移动模型的各个部分。例如,用户可以选择手机的顶部并移动鼠标以打开手机。应用阶段必须将鼠标移动转换为相应的旋转矩阵,然后确保渲染时该矩阵正确应用于手机翻转。另一个例子:播放相机沿着预定路径移动的动画,以从不同角度展示手机。相机的时间相关参数(例如位置和视图方向)必须由应用程序阶段更新。对于渲染的每一帧,应用程序阶段将相机位置、灯光和模型基元传递到管道中的下一个主要阶段,即—— 几何阶段。
2.5.2几何阶段
在应用阶段计算视图变换矩阵,以及每个模型位置和方向的模型变换矩阵。对于传递到几何阶段的每个对象,这两个矩阵通常相乘并组合成一个矩阵。在几何阶段,对象的顶点和法线通过这个合并矩阵变换到视图空间中。然后使用材质和光源属性计算顶点着色。然后执行投影,将对象转换为代表可见一切的单位立方体空间。立方体之外的所有图元都将被丢弃。为了获得完全位于单位立方体内的图元序列,与单位立方体相交的所有图元都被立方体剪裁。然后将顶点映射到屏幕上的窗口。执行所有这些基元操作后,生成的数据将传递到管道中的最后一个重要阶段- 光栅化阶段。
【深入解析图形学核心:渲染管线原理与技巧】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我以前一直很好奇屏幕上的图像是怎么制作出来的,现在终于明白一点了!
有16位网友表示赞同!
这个渲染管线听起来非常复杂啊,要好好学习一下。
有16位网友表示赞同!
原来光是简单的点、线和面,经过这些步骤就能变成3D模型了。太厉害了!
有9位网友表示赞同!
以前还以为软件直接画出来的是最终的图像,没想到是这样的复杂的流程呢。
有6位网友表示赞同!
学习渲染管线能让我更好地理解游戏设计吗?
有5位网友表示赞同!
这个概念听起来很有趣,我要找个相关的教程看看。
有19位网友表示赞同!
现在知道电脑是怎么渲染出逼真的图像了!之前真是没想过这些细节。
有16位网友表示赞同!
感觉了解渲染管线对设计师和程序员都很重要啊!
有13位网友表示赞同!
这篇文章能让我更深入地理解游戏中的光影效果吗?
有11位网友表示赞同!
以后看电影或者玩游戏的时候,可以想想这背后的渲染过程了。
有20位网友表示赞同!
图形学真的就是把数学和艺术结合在一起的魅力啊!
有16位网友表示赞同!
这个渲染管线好像可以应用到很多领域,比如3D打印和虚拟现实吧?
有7位网友表示赞同!
我现在更想研究一下每个步骤是怎么做的了...
有15位网友表示赞同!
哇,原来这个看似简单的像素里隐藏着这么多科技啊!
有6位网友表示赞同!
渲染管线的知识很有用,以后自己在设计中也能尝试运用。
有7位网友表示赞同!
我记得以前看过一篇讲光影效果的文章,现在回头看看应该更容易理解了吧!
有19位网友表示赞同!
想要学习制作3D模型需要了解图形学吗?
有7位网友表示赞同!
这个标题让我对图形学的深度有了更清晰的认识。
有18位网友表示赞同!
希望将来人工智能也能像人一样进行渲染工作!
有8位网友表示赞同!