实时渲染(RealTimeRendering-4thEdition)笔记——2图形渲染管线

本文深入解析图形渲染管线的四大阶段:应用程序、几何处理、光栅化和像素处理,阐述每阶段的功能、处理流程及关键技术,如顶点着色、投影、裁剪、屏幕映射、三角形设置和遍历、像素着色等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图形渲染管线(the graphic rendering pipeline)


功能

图形渲染管线(the graphic rendering pipeline)可以理解为:给定输入的3D图形、光线、虚拟相机位置以及更多信息,进而生成或者说渲染(render)相应2D图片的一系列算法过程(博主:从硬件上说会有另一种定义)。可以说图形渲染管线是实时渲染的基础工具。
在这里插入图片描述
如上图所示,通过输入的3D数据可以产生一张对应2D图片。输出图片中的形状及其位置结果是由输入的3D数据的几何位置、环境特征(the characteristics of the environment)、和虚拟相机在场景中的位置(左图四棱锥侧棱的汇聚点)所决定的。而输出图片中各模型对象的外观受材质、纹理、光源和着色方程(shading equation)等设定参数的影响。


具体结构

首先简单的讨论下使用管线这种结构的优势。完成对3D图形的渲染是一个庞大的任务,所有的操作并不是在同一个处理器上完成。通过多核cpu和gpu内各硬件单元的配合,渲染的流程可以被根据运行的硬件单元进行细分,而依次使用不同的硬件单元同步完成(pipeline可以翻译成流水线),通过这种管线架构渲染效率可以实现倍数的增长。
图形渲染管线可以被粗略的分为四个阶段:应用程序(application),几何处理(geometry processing),光栅化( rasterization),像素处理(pixel processing)
在这里插入图片描述
其中的每一个阶段又可能包含若干子阶段,子阶段有可能通过借助各自的硬件单元(hardware unit)实现流水进一步提高整体运行效率。此外要注意,将图形渲染管线进行函数化的分割为若干阶段(functional stages)的概念要与实际的管线结构实现相区分。每个阶段只是有确定的执行任务但是并没有对任务中的具体实现方式进行规定;可能实际的实现结果会用一个硬件单元完成两个函数化阶段的任务,一个函数化阶段的任务也有可能被多个硬件单元所完成。

1.应用程序

顾名思义,应用程序阶段是通过软件程序驱动的,一般在通用CPU上运行。这一阶段并不会像之后几个阶段一样可以被分为子阶段,但一般多核CPU可以对这一阶段有着很大的帮助,它可以让这一阶段所需完成的多种任务被并行完成,提高此阶段的执行效率。传统上来说这一阶段包括的任务有碰撞检测(collision detection),全局加速算法(global acceleration algorithms),动画(animation), 物理仿真(physics simulation)和其他由应用种类决定的多种任务。
应用程序阶段运行在CPU上,因此程序员可以完全掌控这一阶段的实现策略。可以简单的对其进行调试根据结果进行修改,修改的结果可能也会影响到接下来各阶段的发挥(比如减少需要渲染的三角形数量)。有些GPU也可以完成应用程序阶段的任务。通过一个称为计算着色器(compute shading)的接口,我们可以忽视GPU本来的图形渲染用途,而至将其作为一个并行处理机完成一些本该在CPU完成的任务。(博主:不知道CUDA应用到深度学习训练是否能作为一个例子)
在应用程序阶段结束时,需要完成渲染的几何图元(点、线、三角形)应该被输送给几何处理阶段,最终它们中的一部分会被绘制在屏幕中。而这时应用程序阶段最为首要的任务。碰撞检测是这一阶段普遍需要完成的任务。当两个物体的碰撞被侦测到后,一个响应会被反馈给两个物体对象和力反馈装置(force feedback device)。此外这一阶段还需要处理输入,包括键鼠、陀螺仪等设备的信息。一些加速算法,比如各种剔除算法(culling algorithms)也在此阶段实现。

2.几何处理

这一阶段要处理变换(transform)、投影(projection)等几何操作,需要计算出**哪些将被绘制?被如何绘制?绘制在哪里?**的问题。它完成了大部分的逐三角形、逐点的操作。这一阶段一般由包含可编程核心( programmable cores)和固定操作单元(fixed-operation)的GPU来实现。
几何处理阶段可以再被分割成功能性的子阶段:顶点着色(vertex shading),投影(projection),裁剪(clipping),屏幕映射(screen mapping)。


  • 顶点着色
    顶点着色有两个主要的任务,计算顶点的位置、计算顶点所携带的信息(比如顶点处法向量、顶点对应纹理坐标的位置等)。如此计算的顶点信息可以在后续阶段用于插值,来计算线面上的各点相应值。这一阶段由GPU中的可编程顶点处理硬件单元称作顶点着色器(vertex shader )。
    顶点坐标的计算经历一系列转化过程,过程中一个模型会被转化到不同的坐标空间系统中。起初模型所在的空间称为局部空间(model space),我们可以对同一个模型的不同副本进行不同的模型变换(model transform) 使其在世界空间(world space) 拥有不同的位置、角度、尺寸(获取不同副本的过程称为实例化)。当在世界空间中,所有的模型使用的坐标系将会得到统一。在场景中只有被相机(camera)或观察者(observer)观察到的对象会被渲染,而相机在世界空间中除了有自己的坐标之外,还有一个向量用于指定相机所对准的方向。为了便利于接下来的投影和裁剪,我们需要使用视图变换(view transform) 将世界空间中的坐标转化为相机位于原点而相机方向对准Z轴负方向(在有些文章使用Z的正方向),y向上,x向右的坐标空间,称为相机空间(camera space)或者视图空间(view space、 eye space)。一般模型变换和视图变换使用的都为4*4矩阵,而实际具体的实现方式可以由程序员自己决定。
    在这里插入图片描述
    上图显示了世界空间坐标系和视图空间坐标系的例子,通过定义照相机的位置和对准方向,可以计算出相应的视图变换矩阵,将场景变换为视图空间的坐标系,这一变换使得投影裁剪更为便捷
    除了渲染模型对象的位置和形状信息,顶点着色过程还要计算模型的外观。这一过程要包含对模型材质和任意对模型产生光照的场景光线的分析,分析的过程需要对模型上不同的点计算着色方程(shading equation),因此顶点要携带所有用于计算着色方程的数据。

  • 投影
    通过投影将视图空间视域体(view volume) 转化为一个单元立方体(unit cube)。立方体习惯设定为一个x,y∈[-1, 1] z∈[0, 1]的三维空间。常用的投影有两种:正交投影(orthographic 又称平行 parallel)透视投影(perspective projection)
    在这里插入图片描述
    左图所示的为正交投影,它使用平行线将物体投影到面中,这一投影常用于工程领域,它最大的特征就是物体中平行的线在投影结果中仍然是平行的。右图为透视投影,它服从近大远小的原则,平行线最终都会汇聚。

  • 一些可选顶点处理
    在完成了顶点的常规处理,GPU可以按序执行下面3种可选的操作:曲面细分(tessellation), 几何着色(geometry shading), 流输出(stream output)
    在实际生成的2D结果中会由于三角形的数量过少而在本应该光滑的模型表面看到三角形拼接的结果,为了提高渲染效果,我们可以选择由程序员手动增加输入模型的三角形个数。但这在大多情况下是不实用的,例如当渲染的模型远离相机,在屏幕中这个模型显示的会很小,我们并没有必要对这个远处的物体提高三角形数量,这会消耗大量的内存。所以曲面细分方法由硬件通过判断距离,动态的对不同模型表面相应生成不同数目的三角形,提高渲染质量。
    几何着色和曲面细分有类似之处,它们都可以为模型生成新的图元。但是几何着色生成图元的规模和种类与曲面细分相比有很大的限制。一般几何着色最流行的作用是生成粒子效果,对一个顶点进行几何着色,使其扩展为两个三角形拼成的正方形,如此可以模拟烟花爆炸火球等粒子特效。
    流输出可以将GPU视为一个几何学引擎,将GPU中运算的结果输出,使用数组存储。这一结果可以提供给CPU或者GPU自身作为进一步处理的数据。粒子特效中也是这一阶段的典型应用。

  • 裁剪
    只有全部或者部分出现在视域体内的图元才会被输送到格栅化阶段。一部分出现的图元必须要对其进行切割。通过设置新的视阈体和图元的交点,我们可以得到图元切割后的新表示结果。
    在这里插入图片描述
    如图被裁剪的图元会在交点处添加新的顶点,以此得到图元裁剪结果
    需要注意到的是,通过之前获取视图空间并投影的操作,裁剪操作将会获得一致性(永远使用固定尺寸进行切割)。此外还可以使用额外的平面对图元进行分割,这种操作称为剖分操作(sectioning) ,剖分后可以看到模型的内部渲染结果。

  • 屏幕映射
    通过之前的操作我们已经得到了称为标准化设备坐标空间(normalized device coordinates) 的立方体。下一步屏幕映射将立方体内的坐标与实际屏幕像素坐标完成绑定。假设屏幕的坐标范围在(x1,y1)和(x2,y2)之间,则我们要通过放缩操作将之前的单位立方体的xy坐标映射到屏幕范围内,z坐标默认被映射为[0,1]范围内,如此得到的三维坐标空间称为窗口坐标(window coordinates)
    我们知道对像素的表示会是一个整数,而窗口坐标仍然是一个浮点数,它的整数位置会是两个像素的边界(比如0.0和1.0是一个像素的左边和右边而像素中心应当对应0.5的位置),基于这种约定,我们使用如下公式来完成窗口坐标和像素二维整数索引的映射。
    在这里插入图片描述
    其中floor函数为向下取整函数

至此我们完成了几何处理阶段的任务,关于投影和裁剪二者的完成流程还有许多需要注意的细节,我们放到后续章节再详细讨论。

3.光栅化

这一阶段接受输入的信息建立三角形,计算位于三角形范围内的像素坐标,并将这些坐标输出给最后的阶段。这一阶段由GPU完成。这一阶段氛围里两个子阶段:三角形设置(triangle setup)三角形遍历(triangle traversal),三角形设置又称图元装配(primitive assembly) 。虽然术语中带有“三角形”,但这两个子阶段也需要施加到包括点、线和三角形所有图元上。

  • 三角形设置:在这一阶段三角形的微分属性、边的方程和其他相关数据会被计算出来。得到的数据会用于三角形遍历或对几何处理阶段的着色数据进行插值。这一子阶段由GPU固定功能单元完成。
  • 三角形遍历:在这一阶段我们需要判断并获取位于三角形内部的像素并对这些像素生成对应的片元(fragment),有很多方法可以判断像素是否在三角形范围内,最简单的使用像素中心位置是否位于三角形内,此外还可以使用多个采样点的超级采样(supersampling)多重采样(multisampling ) 反锯齿技术,还有一种称为保守光栅化(conservative rasterization) 的技术,在这种方法中只要像素块中有一部分和三角形重叠就会判断像素在三角形范围内。获得片元后续要通过插值计算获得的片元的着色属性,这时不能进行简单的线性插值,而需要借助于深度属性z坐标值来实现插值过程。

4.像素处理

最后像素处理阶段对每一个像素执行一段程序,决定像素的颜色,对像素进行深度测试(depth testing)来判断其是否可见。在每个像素上还有可能完成新的颜色与之前的颜色向混合的操作。这一阶段同样也由GPU完成。像素处理阶段包含像素着色(pixel shading)混合(merge) 两个子阶段。

  • 像素着色:程序员可以实现像素着色器(OpenGL称片元着色器)控制GPU的可编程单元,完成对之前得到的插值着色结果的进行所需要的处理过程,最终每个片元对应输出一个或若干个颜色。在这一阶段可以实现种类繁多的技术,纹理(texturing) 就是重要的一种。
  • 混合:记录2D图片中每个像素颜色信息的缓冲器称为颜色缓冲器(color buffer),混合操作负责将像素着色阶段新计算出的颜色,与目前颜色缓冲器内的颜色进行混合计算。这一阶段又称ROP,是“raster operations (pipeline)”或者“render output unit”的简称。完成这一任务的GPU子单元不像像素着色一样拥有可编程的灵活性,但是它仍然是高度可配置的,可以完成我们需要的效果。
    判断像素可见性(visible)是混合过程中完成的任务,Z缓存(z-buffer)技术是常用的一种,通过建立深度缓冲区记录每个像素当前渲染的z坐标值,遍历所有图元内的片元,如果计算新的片元z坐标比深度缓冲区中的位置更靠近相机,那么就对深度缓冲区和该位置的颜色进行更新。不难看出这种方法是O(n)时间的,n代表图元的个数,而且算法过程与遍历的图元及内部片元顺序无关。但是这一方法难以对半透明图元进行处理,这是z缓存方法的短处。
    除了提到的深度缓冲和颜色缓冲,GPU内还有多种缓存或者通道:alpha通道与不透明度相关,模板缓冲器(stencil buffer)可以设置每个图元需要渲染的部分,帧缓冲器(framebuffer)包含系统中的所有缓冲器,双重缓冲器(double buffering)保证每次将渲染完毕的前缓冲区展示在屏幕,而同时后缓冲区进行渲染过程,待后缓冲渲染完毕,通过两个缓冲器的交换操作重复之前的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值