笨办法读RTR4(翻译) Real-Time Rendering 4th : Chapter 2 - The Graphics Rendering Pipeline (下)

时间:2024-04-07 13:05:41

笨办法读RTR4(翻译) Real-Time Rendering 4th : Chapter 2 - The Graphics Rendering Pipeline (下)

实时渲染(第四版)Real-Time Rendering (Fourth Edition)

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

2.4 光栅化阶段 Rasterization

给定经过变换和投影的顶点及其关联的着色数据之后(全部来自几何处理),下一阶段的目标是查找要渲染的图元(例如三角形)内的所有像素。我们称这种过程为光栅化,它分为两个功能子阶段:三角形设置(Triangle Setup,也称为基本装配)和三角形遍历(Triangle Traversal)。这些显示在图2.8的左侧。请注意,它们也可以处理点和线,但是由于三角形最常见,因此子阶段的名称中带有“ 三角形”。光栅化,也称为扫描转换,是从屏幕空间中的二维顶点(每个顶点具有z值(深度值)以及与每个顶点相关的各种着色信息)到屏幕上像素的转换。光栅化也可以被视为几何处理和像素处理之间的同步点,因为在这里,三角形是由三个顶点形成的,并最终发送到下一阶段进行像素处理。

笨办法读RTR4(翻译) Real-Time Rendering 4th : Chapter 2 - The Graphics Rendering Pipeline (下)

图2.8  左:光栅化分为两个功能阶段,称为三角形设置和三角形遍历。 右图:像素处理分为两个功能阶段,即像素着色和合并。

三角形是否被视为与像素重叠取决于您如何设置GPU管线。例如,您可以使用点采样来确定“内部”。最简单的情况是在每个像素的中心使用一个点采样,因此,如果该中心点在三角形内部,则相应的像素也被认为在三角形内部。您还可以使用超采样或多采样抗锯齿技术对每个像素使用一个以上的采样(第5.4.2节)。还有一种方法是使用保守光栅化,其定义是,如果像素的至少一部分与三角形重叠,则该像素“位于三角形内”(第23.1.2节)。

 

2.4.1 三角形设置 Triangle Setup

在这一阶段,计算三角形的微分,边方程和其他数据。 这些数据可用于三角形遍历(第2.4.2节),以及用于内插(interpolation)几何阶段产生的各种阴影数据。 固定功能硬件用于此任务。

 

2.4.2 三角形遍历 Triangle Traversal

在此检查每个像素(或样本)中心被三角形覆盖的情况,并为与三角形重叠的像素部分生成一个片元(fragment)。 更多详细的采样方法可以在第5.4节中找到。 查找哪些样本或像素在三角形内通常被称为三角形遍历。 每个三角形片段的属性都是使用在三个三角形顶点之间插值的数据生成的(第5章)。 这些属性包括片段的深度,以及来自几何图形阶段的任何阴影数据。 McCormack [1162] 等等提供了更多关于三角形遍历的信息。 在这里,也可以在三角形上执行透视校正内插(perspective-correct interpolation)(第23.1.1节)。 然后将图元内部的所有像素或样本发送到像素处理阶段,这将在下一节将详细论述。


引用[1162]: McCormack, Joel, and Robert McNamara, “Tiled Polygon Traversal Using Half-Plane Edge Functions,” in Graphics Hardware 2000, Eurographics Association, pp. 15–22, Aug. 2000. Cited on p. 22, 996, 997

 

2.5 像素处理阶段 Pixel Processing

在此阶段,经过之前所有阶段的处理,已经找到了在三角形或其他图元内部应考虑的所有像素。 像素处理阶段分为像素着色和合并,如图2.8右侧所示。 像素处理是对图元内部的每个像素(或样本)执行计算和操作的阶段。

 

2.5.1 像素着色 Pixel Shading

使用插值的着色数据作为输入,此处可以执行任何每个像素的着色计算。最终结果是一种或多种颜色将传递到下一个阶段。与通常由专用的硬连线硅(dedicated, hardwired silicon)执行的三角形设置和遍历阶段不同,像素着色阶段由可编程GPU内核执行。为此,程序员为像素着色器(或片段着色器、片元着色器,如OpenGL中所知)提供了一个程序,该程序可以包含任何所需的计算。这里可以使用多种技术,其中最重要的一种是纹理化(Texturing)。在第6章中将更详细地讨论纹理化。简单地说,对一个对象进行纹理化意味着出于各种目的将一个或多个图像“粘合”到该对象上。此过程的一个简单示例如图2.9所示。图像可以是一维,二维或三维图像,其中二维图像是最常见的。最简单的说,最终产品是每个片元的颜色值,并将它们传递到下一个子阶段。

笨办法读RTR4(翻译) Real-Time Rendering 4th : Chapter 2 - The Graphics Rendering Pipeline (下)

图2.9  左上方显示了没有纹理的龙模型。 图像纹理中的碎片被“粘合”到龙上,结果显示在左下方。

 

2.5.2 合并 Merging

每个像素的信息都存储在颜色缓冲区中,颜色缓冲区是颜色的矩形阵列(每种颜色的红色,绿色和蓝色分量)。合并阶段负责将像素着色阶段产生的片元颜色与当前存储在缓冲区中的颜色进行组合。 此阶段也称为ROP,代表“光栅操作(管道)”(raster operations (pipeline))或“渲染输出单元”(render output unit)。与着色阶段不同,执行此阶段的 GPU 子单元通常不是完全可编程的。 但是,它是高度可配置的,可实现各种效果。

此阶段还负责解决可见性。这意味着在渲染了整个场景之后,颜色缓冲区应包含场景中的原始颜色,这些颜色从相机的角度是可见的。对于大多数甚至所有图形硬件,这都是通过z缓冲区(也称为深度缓冲区)算法[238]完成的。 Z缓冲区的大小和形状与颜色缓冲区相同,并且对于每个像素,Z缓冲区将z值存储到当前最接近的图元。这意味着,当将图元渲染到某个像素时,该图元在该像素处的z值将被计算并与同一像素处z缓冲区的内容进行比较。如果新的z值小于z缓冲区中的z值,则正在渲染的图元比之前在那个像素处最接近相机的图元更接近相机。因此,该像素的z值和颜色将使用所绘制图元的z值和颜色进行更新。如果计算的z值大于z缓冲区中的z值,则保持颜色缓冲区和z缓冲区不变。 z缓冲区算法很简单,具有 笨办法读RTR4(翻译) Real-Time Rendering 4th : Chapter 2 - The Graphics Rendering Pipeline (下) 收敛(其中n是要渲染的图元的数量),并且适用于可以为每个(相关)像素计算z值的任何绘图图元。还要注意,该算法允许大多数原语以任何顺序呈现,这是其普及的另一个原因。但是,z缓冲区仅在屏幕上的每个点存储一个深度,因此不能用于部分透明的图元。必须在所有不透明基元之后,以从后到前的顺序或使用单独的独立于顺序的算法(第5.5节)呈现这些内容。透明度是基本z缓冲区的主要弱点之一。

我们已经提到了颜色缓冲区用于存储颜色,而z缓冲区用于存储每个像素的z值。 但是,还有其他通道和缓冲区可用于筛选和捕获片元信息。 Alpha通道与颜色缓冲区关联,并为每个像素存储相关的不透明度值(第5.5节)。在较早的API中,Alpha 通道还用于通过 Alpha 测试功能选择性地丢弃像素。 如今,可以将丢弃操作插入到像素着色器程序中,并且可以使用任何类型的计算来触发丢弃。 可以使用这种类型的测试来确保完全透明的片段不会影响z缓冲区(第6.6节)。

控制渲染到颜色缓冲区和z缓冲区中。举个例子,假设已将填充圆绘制到模板缓冲区中。可以将其与允许仅将出现圆的情况下将后继图元渲染到颜色缓冲区中的运算符组合。模板缓冲区是生成某些特殊效果的强大工具。流水线末端的所有这些功能都称为光栅操作(ROP)或混合操作。可以将当前颜色缓冲区中的颜色与三角形内要处理的像素的颜色混合。这可以实现诸如透明度或颜色样本累积的效果。如前所述,混合通常可以使用API进行配置,而不是完全可编程的。但是,某些API支持光栅顺序视图,也称为像素着色器顺序(Pixel Shader Ordering),可启用可编程混合功能。

 

2.6 管线概览 Through the Pipeline

点,线和三角形是用于构建模型或对象的渲染图元。 假设该应用程序是交互式计算机辅助设计(CAD)应用程序,并且用户正在检查华夫饼制造商的设计。 在这里,我们将在整个图形渲染管道中遵循此模型,包括四个主要阶段:应用程序,几何,光栅化和像素处理。 通过透视图将场景渲染到屏幕上的窗口中。 在这个简单的示例中,华夫饼制作机模型同时包含线(以显示零件的边缘)和三角形(以显示表面)。 松饼机的盖子可以打开。 一些三角形是由带有制造商徽标的二维图像制成的。 对于此示例,除了在光栅化阶段发生的纹理应用之外,表面着色是在几何阶段完全计算出来的。

应用程序阶段(Application)

渲染时该矩阵已正确地应用于盖子。 另一个例子:播放动画,使动画沿预定路径移动,以从不同的角度显示华夫饼制作机。 然后必须由应用程序根据时间更新相机参数,例如位置和视图方向。 对于要渲染的每个帧,应用程序阶段将相机的位置,照明和模型的图元馈入管道中的下一个主要阶段-几何处理阶段。

几何处理阶段(Geometry Processing)

对于透视图,我们在此假定应用程序已提供了投影矩阵。同样,对于每个对象,应用程序都已计算出一个矩阵,该矩阵描述了视图变换以及对象本身的位置和方向。在我们的示例中,华夫饼制造商的底座将具有一个矩阵,而盖子则具有另一个矩阵。在几何阶段,使用此矩阵转换对象的顶点和法线,从而将对象放入视图空间(view space)。然后,可以使用材质和光源属性来计算顶点处的着色或其他计算。然后使用单独的用户提供的投影矩阵执行投影,将对象转换为代表眼睛所见的单位立方体的空间。单位立方体外部的所有图元都将被丢弃。将与该单位多维数据集相交的所有图元都裁剪到该多维数据集上,以便获得一组完全位于单位立方体内的图元。然后将这些顶点映射到屏幕上的窗口中。在完成所有这些每个三角形和每个顶点操作之后,将所得数据传递到光栅化阶段。

光栅化阶段(Rasterization)

然后光栅化所有在上一阶段幸存下来的图元,这意味着找到了图元内部的所有像素,并将它们进一步发送到管线以进行像素处理。

像素处理阶段(Pixel Processing)

此处的目标是计算每个可见图元的每个像素的颜色。 那些与任何纹理(图像)相关联的三角形将根据需要应用这些图像进行渲染。 可见性通过z缓冲区算法以及可选的丢弃和模板测试来解决。 依次处理每个对象,然后将最终图像显示在屏幕上。

总结(Conclusion)

该管道源于针对实时渲染应用程序的数十年的API和图形硬件演变。 重要的是要注意,这不是唯一可能的渲染管道。 脱机渲染管道经历了不同的演进路径。 电影制作的渲染通常是通过微多边形管线(micropolygon)完成的[289,1734],但是射线追踪和路径追踪近来已被接管。 11.2.2节中介绍的这些技术也可以用于建筑和设计的预可视化。

多年来,应用程序开发人员使用此处描述的过程的唯一方法是通过使用中的图形API定义的固定功能管道。 固定功能管道之所以如此命名,是因为实现它的图形硬件包含无法灵活编程的元素。 主要的固定功能机器的最后一个例子是2006年推出的Nintendo的Wii。另一方面,可编程GPU使得可以确切确定在整个生产流程的各个子阶段应用了哪些操作。 对于本书的第四版,我们假设所有开发都是使用可编程GPU完成的。


引用:[289] Cook, Robert L., Loren Carpenter, and Edwin Catmull, “The Reyes Image Rendering Architecture, Computer Graphics (SIGGRAPH ’87 Proceedings), vol. 21, no. 4, pp. 95–102, July 1987. Cited on p. 26, 774, 908

[1734] Tabellion, Eric, and Arnauld Lamorlette, “An Approximate Global Illumination System for Computer Generated Films,” ACM Transactions on Graphics (SIGGRAPH 2004), vol. 23, no. 3, pp. 469–476, Aug. 2004. Cited on p. 26, 491

进一步阅读和资源(Further Reading and Resources)

布林的著作《图形流水线之旅》 [165]是一本关于从头开始编写软件渲染器的旧书。 它是学习实现渲染管线的一些精妙之处,解释关键算法(例如裁剪和透视插值)的好资源。 古老的(至今仍经常更新)《 OpenGL编程指南》(又称“红皮书”)[885]提供了图形管线的完整描述以及与其使用相关的算法。 本书的网站 realtimerendering.com 提供了指向各种管线图,渲染引擎实现等的链接。


引用:[165] Blinn, Jim, Jim Blinn’s Corner: A Trip Down the Graphics Pipeline, Morgan Kaufmann, 1996. Cited on p. 27, 832, 1059

[885] Kessenich, John, Graham Sellers, and Dave Shreiner, OpenGL Programming Guide: The Of- ficial Guide to Learning OpenGL, Version 4.5 with SPIR-V, Ninth Edition, Addison-Wesley, 2016. Cited on p. 27, 39, 41, 55, 96, 173, 174