为什么3D引擎主要使用三角形来绘制表面?

68

为什么在三维绘图中,通常使用三角形来绘制表面?而不是正方形或其他形状?


1
仅简单地添加一点内容,多边形(更确切地说是三角形)并不是渲染 3D 表面的唯一方法:请查看 surfels(http://www.filipvanbouwel.be/master_thesis.php)、voxels 等。 - Alexandre Abreu
@AlexandreAbreu,你的链接已失效。 - Refael Sheinker
双线性贴片(http://shaunramsey.com/research/bp/ramseybilinear.pdf)和贝塞尔曲面(https://en.wikipedia.org/wiki/B%C3%A9zier_surface)这两种样条有时也用于绘制三维表面。 - Shaun Ramsey
Nvidia在2019年也对我的双线性补丁工作进行了不错的更新:(https://research.nvidia.com/publication/2019-03_cool-patches-geometric-approach-raybilinear-patch-intersections) - Shaun Ramsey
3个回答

96

三角形永远不可能是非平面的;任何具有超过3个点的物体都可能是非平面的,因此无法渲染,除非将其转换为三角形。

例如:如果构成正方形的所有点都共面,则正方形是两个在同一平面上的三角形。要确保所有点都共面需要进行大量计算,因此所有大于3个点的多边形都被预先计算为三角形,并测试以确保所有点仅在第一次渲染时共面,而不是在每个渲染帧上进行计算。

这里有一个关于多边形网格的好参考 about polygon meshes

平面网格


(来源: softimage.com)

非平面网格


(来源: softimage.com)

我再举一个例子来更清楚地说明:


(来源:autodesk.com)

非平面网格是退化的,无法以任何明智的方式进行排序或正确渲染。三角形没有这个问题。

效率

三角形也非常节省内存,并且在使用Triangle Strips时可以快速排序和渲染,每个额外三角形只需要存储1个点。

http://upload.wikimedia.org/wikipedia/en/0/03/Triangle_Strip.png

还有三角形扇形,它是三角形带的一种特殊情况。


(来源:codesampler.com)


还有一个要点需要提出,那就是当光线射向三角形并且交点在哪里相对容易确定。此外,在节点之间进行颜色属性的插值也相对容易实现。 - John Alexiou
3
为什么非平面表面无法渲染?“无法渲染”的意思是什么? - penguin99
以上大部分内容都可以通过平面凸多边形网格来完成,除了扇形。其他多边形/物品也可以渲染,但如果它们不直接在硬件中渲染,则速度会很慢。事实上,光栅化的硬件加速是针对三角形完成的,这是一个明智的选择(稍后详细说明),因此我们使用三角形。早期的网格在多边形的边数方面无所适从。但将任何凸多边形转换为三角形很容易,因此作为基本的图元,三角形是有意义的。紧凑、平面、简单。 - Shaun Ramsey

17

因为最少需要3个点才能定义一个平面表面,所有的形状都可以用多个三角形进行模拟,而且现有高效算法可以快速在屏幕上绘制这些三角形。


13

基本上,任何复杂(表面)结构都可以表示为一组三角形。三角形是最基本和原始的几何体。因此,它被用作几乎所有东西的基础。 然而,大多数3D引擎都提供更复杂的基元,如球体、圆锥体、圆柱体、甜甜圈等等。 请查阅您的库文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接