实时渲染(第三版):第二章 图形渲染管道 2.4 光栅化阶段

 。

2.4 光栅化阶段

    给定转换和投影后的顶点及其相关的着色数据(全部来自几何形状阶段),光栅化阶段的目标是计算和设置对象覆盖的像素的颜色。这一个过程叫做光栅化或扫描转换(这种转换将屏幕空间中的2D顶点(每个顶点都有一个z值(深度值)和各种相关的着色信息)转换到屏幕上的像素)。


 图2.8 光栅化阶段细分为多个功能阶段

    和几何形状阶段类似,本阶段也细分为几个功能阶段:建立三角形、遍历三角形、像素着色和合并,如图2.8。

2.4.1 建立三角形

    本阶段计算三角形表面的差值和其他数据。该数据用于扫描转换,以及几何形状阶段生成的各种着色数据的插值。该过程由任务专用的固定操作硬件执行。

2.4.2 遍历三角形

    在这个阶段,将检查每个被三角形覆盖了中心(或某样品)的像素,并为和三角形重叠的像素部分生成片段。查找哪些样品或像素在三角形内部这一过程叫做三角形遍历或扫描转换。每个三角形片段的属性都被使用三角形的三个顶点(参考第五章)间的插值数据生成。这些属性包括片段的深度和来自几何形状阶段的着色数据。Akeley 和 Jermoluk [7]和 Rogers [1077]提供了三角形遍历的更多信息。

2.4.3 像素着色

    本阶段使用插值的着色数据作为输入,执行所有的逐像素着色计算。最终结果是将一个或多个颜色传递给下一个阶段。和建立三角形与遍历三角形阶段不同,本阶段由可编程的GPU核执行。此处有大量的技术可以使用,其中最重要的一种是纹理。纹理在第六章详细介绍。此处,简单地说,对对象进行纹理操作,就是将一幅图像粘合到对象上。这一过程如图2.9所示。图像可以是一维、二维和三维的,其中二维的最为常见。


图 2.9 左上角的龙模型没有纹理。右侧的图像纹理被粘合到龙模型上,结果如左下角所示。

2.4.4 合并

    每个像素的信息被存储在颜色缓冲中,它是颜色的矩形数组(每个颜色拥有红、绿、蓝三部分)。合并阶段负责将着色阶段生成的片段颜色和当前缓冲中存储的颜色进行组合。和着色阶段不同,通常,执行本阶段的GPU子单元不是完全可编程的。不过,它具有较高的配置性,可以启用各种效果。

    本阶段还负责解决可见性。这意味着,在整个场景被渲染后,颜色缓冲应当包含场景中视点可以看到的基元的颜色。对大多数图形硬件,这由z缓冲(也叫深度缓冲)算法[162](当z缓冲无效时,可以使用BSP树以从后到前的顺序渲染场景)完成。z缓冲和颜色缓冲具有相同的大小和形状;它存储每个像素的z值,该值是相机到当前最近基元的距离。这意味着,当一个基元被渲染到某像素时,会首先计算该基元在该像素处的z值,然后将计算出来的z值和当前z缓冲中的z值进行比较。如果计算出来的z值小于当前z缓冲中的,则说明在该像素位置处,现在绘画的基元到相机的距离比前面绘画的基元要近。因此,该像素的z值和颜色应当被更新。如果计算出来的z值大于当前z缓冲中的z值,则颜色缓冲和z缓冲就应当保持不变。z缓冲算法很简单,有一个O(n)集合,其中,n是正被绘画的基元的数目。它作用于能够计算各个(相关)像素的z值的基元。该算法允许大多数基元以任意顺序渲染,这也是它能够普及的一个原因。不过,部分透明的基元不在此列。它们必须在不透明基元之后进行渲染,并且以从后到前的顺序(参考节5.7)。这是z缓冲的主要弱点。

    我们提过,颜色缓冲存储颜色,z缓冲存储z值。除此之外,还有其他通道和缓冲,能够用来过滤和捕捉片段信息。alpha通道关联于颜色缓冲,它存储各个像素的不透明值(参考节5.7)。在深度测试之前,可以对收到的片段进行一个可选的alpha测试(在DirectX10中,alpha测试不再是本阶段的一部分,而是像素着色器的一个函数)。片段的alpha值被用指定的方式(等于,大于等)和参考值进行比较。如果片段未能通过测试,就不会被继续处理。alpha测试通常被用来确保完全透明的片段不会影响到z缓冲(参考节6.6)。

    模板缓冲是一个离屏缓冲,用来记录已渲染的基元的位置。它通常包含8个比特位每像素。首先,可以使用各种函数将基元渲染到模板缓冲;然后,模板缓冲的内容就可以用来控制颜色缓冲和z缓冲的渲染。假设一个实心圆圈已经绘画到模板缓冲。这可以和一个操作组合。该操作允许后续基元只能渲染到圆圈覆盖的颜色缓冲区域。模板缓冲是一个强大的特效工具。在管道最后的所有这些函数叫做光栅操作(ROP)或混合操作。

    帧缓冲一般由系统中的所有缓冲组成,但有时,我们习惯于用它表示颜色缓冲和z缓冲的组合。在1990年, Haeberli 和 Akeley [474] 介绍了一种帧缓冲的补充,叫做累积缓冲。在这种缓冲中,图像可被使用一套操作进行累积。比如,可将显示对象运动的一组图像进行累积和平均,这样就可以生成运动模糊。可以生成的其他效果还有景深、抗锯齿、柔和阴影等。

    当基元到达和传过光栅化阶段,视点可见的将被显示到屏幕上。屏幕显示的是颜色缓冲的内容。为避免人们看到基元光栅化、显示到屏幕的过程,我们使用双缓冲。这就是说,场景的渲染不在屏幕上,而在一个叫做后备缓冲的地方进行。当场景在后备缓冲中渲染好之后,后备缓冲的内容和前缓冲(前面屏幕显示的内容)互换。互换在垂直回扫期间发生。垂直回扫是可以安全执行该操作的时间。

    各种缓冲和缓冲方法的更多信息,参考节5.6.2和18.1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值