何以是三角

759 查看

Joshua Barczak有一个文章我非常喜欢,关于为什么3D图形(一般)采用三角形超过任何其他。这篇文章和iOS开发不直接相关,但我觉得它很有趣!

我喜欢好的理论探讨,所以,当Peter Sikachev道,“……三角形会永远存在吗……”那时候,我做了个决定,抛开工作,跳进这个话题。对于传统观念的质疑以及探究方法背后的原因,是有趣而有益的。那么,为什么我们使用三角形,而不是其它的众多选项?

三角形的好处

当我前阵子在教图形课的时候,我列出了以下几点,支持三角形:

  1. 我们可以用三角形表现任何多面体形状
  2. 我们可以近似任何非多面体表面至任意的准确度,只要有足够多的三角形。
  3. 三角形肯定是平面凸形,这使得它们非常易于光栅化

所以,三角形是一个很好的通用渲染原语。这就是为什么,我们已经能够建立一整个产业,围绕着专门的三角光栅化加速。如果你有一个强大而高效的三角形渲染器,你可以将几乎任何表面模型分解成足够大的一堆三角形,来加以渲染。你可以预先做好这一点,或者你也可以在运行时做,因为这样你就不需要保存全部的三角形网格。

即使是在你可以任性而为的离线渲染领域,仍然可以经常看到渲染器把一切都分解成三角形或四边形,都是为了把事情变简单。Reyes 建立于把每个原语变成四边形网格的想法之上。Kilauea 光线跟踪器全用三角形。PantaRay光线跟踪器把一切都变成三角形或四边形。

三角形的缺点

三角形的缺点以及原因,我让我的学生学习了这些,贝塞尔补丁,NURBS(Non-Uniform Rational B-Splines,非均匀有理B样条曲线),隐式原因,还有些废话:

  1. 准确性。再多数目的多边形,都不能精确地表示一个非多面体。细分时有信息丢失。
  2. 简洁性。即使你可以,这也很难最有效地代表。一个贝塞尔补丁或带位移映射的subdiv表面比其细分形式的数据要少得多。
  3. 建模/动画的便利性。直接操纵三角形网格是非常恼人的,而其他的东西使我们能够建立更直观的工具。

记得,渲染原语和建模原语之间有一个区别,三角形肯定是渲染原语,三角形可以是建模原语,但通常不是。

现在,为了解决具体问题,Peter提出:

失去了PS(译者注:Pixel Shader)的表现,我在这里写过。如果我们愿意跳出着色的条条框框,可能会有些方式。逐顶点着色是一种选择,延迟着色是另一种。如果我们愿意等待硬件的改变,会有更多的选择。我预测,细分技术将会迫使独立硬件厂商来解决这个问题,迟早的事儿。

剪裁/剔除,好的光栅引擎可以并应该使用包围盒为视锥体做剔除,以使得拣出的负载大致与可见图元的数量成比例,而不是场景大小。剔除可用三角形包围盒来完成,并且那样负载很小。裁剪肯定很笨拙,但它较少发生在正常场景。大多数三角形要么在里,要么在外。另外,也可以建立一个不含裁剪的光栅。但这个在硬件社区外鲜为人知,这很不幸,因为它很酷。

体素(Voxels)很是吃内存,更重要的是,做动画时极其痛苦。即使我们可以建立围绕体素的渲染器,我们很可能要为动画变形网格,我们会在运行时再次体素化。如果我们要去碰所有那些麻烦,然后那么我就看不出有什么理由,在栅格化动画的东西之外还画蛇添足,而且如果我们要去碰,也许还要对静态内容做同样处理。唯一的例外是,对于某种GI技巧,你想要低分辨率体素,但那更应该增加三角形不是取代它们。

溅射成像(我假设你的意思是像EWA Splatting or QSplat)。

我可以告诉你的大多数点渲染的研究,是专注于在点云看作为一种替代模型表示。如果你有一个庞大的点云,激光扫描仪扫出来的,你应当直接渲染之,而不是试图先建立一个网格出来。我不觉得尺寸参数是非常引人注目的创造内容,因为你真正保存的是一个索引缓冲区,而当你创造的资源大到引起麻烦时,我们极有可能换成位移映射。

在我看来,点云溅射,和栅格化的密集网格没有本质的不同。要做一个溅射,你必须转换点,找出像素涵盖范围,并着色之。遮蔽令人厌恶。我不知道是否有什么办法,可以让点渲染器做到早期Z剔除,为了能继续讨论,让我们忽略整个问题。

对于一个网格,你得转换顶点,做裁剪(或不做),找出覆盖的像素,并着色之。在最好的情况下(一个封闭的歧管流形和完美的顶点缓存),每个面大约要转换0.5个顶点。根据我的经验,在实际带缓存的网格中,这将在每个面0.7ish到1.5ish顶点之间波动。问题是,每个元素的开销总和可能不是一个像素一个三角形和一个像素一个溅射的不同,特别是当我们在谈论硬件实现的时候。

人为因素

在最末,这最后一个原因(在理论中最不重要,但在实践中最重要):我们已经这样做二十年了,而人们讨厌变化。我们有围绕三角形建立的一个完整的生态系统,即使它不是一个最优的一个,它也是稳定的并为人熟知。似乎不太可能会让他们消失,毕竟我们投入了如此巨大的成本。在未来很长一段时间里,我们将不得不与那些小小的三边虫在一起。