渲染流水管线

什么是渲染流水线

渲染流水线的工作任务在于由一个三维场景出发、生成(或者说渲染)一张二维图像。在计算机中,需要通过一系列顶点数据、纹理等信息,把这些信息转换成图像。简单来说,将3D场景转换为2D图像的一系列流程就是渲染流水线。

渲染流水线的流程

在《Real-Time Rendering, Third Edition》书中将渲染流程分为三个阶段:应用阶段 (Application Stage)、 几何阶段 (Geometry Stage)、 光栅化阶段 (Rasterizer Stage)。

渲染流水线流程图

应用阶段

从名字可以看出,这个阶段由开发者主导,通常由CPU实现,换句话说我们具有这个阶段的绝对控制权。

在本阶段,首先,我们需要准备好场景数据,例如相机位置、场景中模型、光源、视锥体等。

  • 视锥体
    视锥体 (frustum) 是指场景中摄像机的可见锥体范围。它由上、下、左、右、近、远共6个面组成。在视锥体内的景物可见,反之则不可见。为提高性能,只对其中与视锥体有交集的对象进行绘制。

其次,为了提高性能,会进行一个粗粒度剔除的工作,剔除出去的部分不会被移交给下一阶段处理。

最后,我们需要设置好每个模型的渲染状态,比如材质、纹理、Shader等。

在这个阶段**最重要的输出就是渲染所需的几何信息,即渲染图元 (rendering primitives)**。

  • 渲染图元
    1. 点(Point):最简单的图元,表示一个在3D空间中的单个点。渲染时,它可以显示为一个像素。
    2. 线段(Line):由两个顶点定义的一条直线。可以用来绘制线框模型或其他需要线条表示的图形。
    3. 三角形(Triangle):由三个顶点组成的多边形。三角形是最常用的渲染图元,因为任何复杂的形状都可以分解成多个三角形进行渲染。现代图形硬件(GPU)对三角形的渲染有高度优化。

这些渲染图元会被传递到下一个阶段——几何阶段。

几何阶段

几何阶段用来处理所有关于绘制几何相关的任务,例如:决定我们需要绘制的图元是什么、怎么绘制它们、在哪里绘制它们。本阶段通常在GPU进行

几何阶段负责和每一个渲染图元打交道,进行每个顶点、每个多边形的操作。这个阶段可以细分为更小的流水线阶段。几何阶段最主要的任务是把顶点坐标变换到屏幕空间中,再移交给下一阶段处理。

这一阶段会输出屏幕空间的二维顶点坐标、每个顶点的深度值、着色等相关信息。

这些信息会被移交给下一阶段进行处理——光栅化阶段。

光栅化阶段

光栅化阶段是将几何阶段传入的数据生成屏幕上的像素,并渲染出最终的图像。本阶段通常在GPU进行

光栅化阶段的主要任务是决定每个渲染图元中的哪个像素应该被绘制在屏幕上。它需要对几何阶段得到的顶点数据进行插值,再进行像素处理。

光栅化阶段同样可以分为更细小的流水线阶段。

渲染流水线的目的

渲染流水线的最终目的是将3D场景中的所有元素经过一系列流程正确地转换为2D图像,并显示在屏幕上。这个过程需要处理复杂的几何计算、光照计算、纹理映射和各种特效的处理,以生成逼真的图像。

Shader与渲染流水线的关系

Shader是运行在渲染流水线不同阶段的小程序,负责特定任务的处理。在几何阶段,顶点Shader负责处理顶点的变换和光照计算;在光栅化阶段,片段Shader负责处理像素的着色和纹理映射。Shader通过编程控制渲染过程中的各个细节,从而实现更高质量和复杂的图像效果。