计算机图形学基础(8.5)-笔记

Category:Higher Mathematics & Computer Graphics Application

正文

8 图形管道

8.4 剔除基元以提高效率

对象顺序渲染的优势在于它需要对场景中的所有几何体进行一次遍历,这也是复杂场景的弱点。例如,在整个城市的模型中,在任何给定时间都可能只有少数建筑物可见。通过绘制场景中的所有图元可以获得正确的图像,但是大量的精力将浪费在处理可见建筑物后面或观察者后面的几何体上,因此对最终图像没有贡献。

识别并丢弃不可见的几何图形以节省处理它所花费的时间称为剔除。三种常用的剔除策略(经常串联使用)是

视图体积剔除——移除视图体积之外的几何图形;

遮挡剔除——移除可能在视图体积内但被更靠近相机的其他几何体遮挡或遮挡的几何体;

背面剔除——去除背对相机的图元。

我们将简要讨论视图体积剔除和背面剔除,但高性能系统中的剔除是一个复杂的话题;有关完整的讨论和有关遮挡剔除的信息,请参见 (Akenine-M ¨oller et al., 2008)

8.4.1 查看体积剔除

当整个图元位于视图体积之外时,它可以被剔除,因为它在光栅化时不会产生碎片。如果我们可以通过快速测试剔除许多图元,我们或许能够显着加快绘图速度。另一方面,单独测试图元以确定需要绘制哪些图元可能比让光栅化器消除它们的成本更高。

视图体剔除,也称为视锥体剔除,在将许多三角形分组为具有关联边界体积的对象时特别有用。如果边界体位于视图体之外,那么构成对象的所有三角形也是如此。例如,如果我们有 1000 个三角形,由一个中心为 c 和半径为 r 的球体包围,我们可以检查球体是否位于剪切平面之外,

image.png

其中a是平面上的一个点,p是一个变量。这相当于检查球心 c 到平面的有符号距离是否大于 r。这相当于检查

image.png

请注意,即使在所有三角形都位于飞机外面的情况下,球体也可能重叠飞机。因此,这是一个保守的测试。测试的保守程度取决于球体对象的界限。

如果在第12章中描述的空间数据结构之一中组织了场景,则可以从等级应用相同的想法。

8.4.2 背面剔除

当多边形模型是封闭的,即它们限定了一个没有孔的封闭空间时,它们通常被假定为具有向外的法向量,如第 10 章所讨论的。对于这样的模型,远离眼睛的多边形肯定是被面向眼睛的多边形透支。因此,这些多边形可以在管道开始之前被剔除。此条件的测试与第 10.3.1 节中给出的剪影图相同。

常问问题

• 我经常看到对剪裁进行详细讨论,而且它比本章中描述的要复杂得多。这里发生了什么?

本章中描述的剪裁是有效的,但缺乏工业级剪裁器所具有的优化。这些优化在章节注释中列出的 Blinn 的权威著作中进行了详细讨论。

• 非三角形的多边形如何栅格化?

这些可以直接逐行扫描,也可以分解成三角形。后者似乎是更流行的技术。

• 抗锯齿总是更好吗?

不会。有些图像在没有抗锯齿的情况下看起来更清晰。许多程序使用无锯齿的“屏幕字体”,因为它们更易于阅读。

• 我的 API 文档讨论了“场景图”和“矩阵堆栈”。这些是图形管道的一部分吗?

图形管道的设计当然考虑到了这些,我们是否将它们定义为管道的一部分是一个品味问题。本书将他们的讨论推迟到第 12 章。

• 均匀距离z 缓冲区是否比包含透视矩阵非线性的标准缓冲区更好?

这取决于。非线性的一个“特征”是 z 缓冲区在眼睛附近具有更高的分辨率,而在远处则具有更低的分辨率。如果使用细节层次系统,那么远处的几何图形会更粗糙,并且 z 缓冲区的“不公平”可能是一件好事。

• 软件z-buffer 有用吗?

是的。大多数使用 3D 计算机图形的电影都使用了 Pixar 开发的软件 z-buffer 的变体(Cook、Carpenter 和 Catmull,1987)。

笔记

Jim Blinn 的《Corner: A Trip Down the Graphics Pipeline》是一本关于设计图形管道的精彩书籍(J. Blinn,1996 年)。 3D 游戏引擎设计 (Eberly, 2000) 和实时渲染 (Akenine-M øller et al., 2008) 中有许多关于管道和剔除的精彩细节。

练习

  1. 假设在透视变换中我们有 n = 1 和 f = 2。在什么情况下我们会发生“反转”,即透视变换前后的顶点从眼睛前面翻转到眼睛后面,反之亦然?
  2. 在透视分割后有什么理由不夹入 x 和 y(见图 11.2,阶段 3)?
  3. 导出 0 < m ≤ 1 的端点颜色的中点画线算法的增量形式。
  4. 修改三角形绘制算法,使其恰好为三角形边缘上通过 (x, y)=(-1, -1) 的点绘制一个像素。
  5. 假设您正在为飞行模拟设计一个整数 z 缓冲区,其中所有对象的厚度至少为 1 米,距离观察者的距离永远不会超过 4 米,并且可能远达 100 公里。 z 缓冲区中需要多少位才能确保没有可见性错误?假设能见度误差只在观察者附近很重要,即距离小于 100 米。在这种情况下需要多少位?