为什么网格中的T型结会导致裂缝?


19

我从许多消息来源获悉,在3D网格中包含T型结是一个坏主意,因为它可能在渲染过程中导致裂缝。有人可以解释为什么会发生这种情况吗?如何避免这种情况发生?


Answers:


20

从镶嵌细分的角度来看,lhf的答案是好的,但是在更简单的三角形网格用例中可能会出现这些问题。

以三个屏幕空间三角形,ABC,ADE和DBE的简单示例为例...

在此处输入图片说明

尽管从数学上讲,点E恰好位于线段AB上,但管道不会使用完全精确的值,例如有理数(例如https://gmplib.org/)。相反,它可能会使用浮点数,因此将引入一些近似/误差。结果可能是这样的:

在此处输入图片说明

请注意,所有顶点都可能不正确。尽管上面的示例显示了裂缝,但T形结可能会导致沿边缘的重叠,从而导致像素绘制两次。这可能看起来并不坏,但是可能导致透明性或模板操作问题。

然后,您可能会认为,使用浮点运算时,引入的错误将微不足道,但是在渲染器中,屏幕空间顶点(X,Y)值几乎总是由定点数表示,因此距理想位置的位移将通常更大。此外,随着渲染硬件以其自身的内部精度逐个像素“内插”线段,甚至有更多机会偏离E的舍入位置。

如果通过将三角形ABC分成两部分(即AEC和EBC)来“去除” T型结,则该问题将消失,因为由误差引起的偏移将保持一致。

现在,您可能会问为什么渲染器(尤其是硬件渲染器)将定点数学用于顶点XY坐标?他们为什么不使用浮点数来减少问题?尽管有些人做到了(例如Sega的Dreamcast),但它可能会导致另一个问题,即三角形设置数学上的灾难性错误,尤其是对于长细三角形而言,是不正确的,并且它们以不愉快的方式更改大小。


2
当您说“顶点(X,Y)值几乎总是由定点数字表示”时,我猜您是指光栅化器中屏幕空间顶点坐标,对吗?不是原始的模型空间顶点。
内森·里德

2
@NathanReed是的。只是屏幕空间X&Y(也许在某些GPU上是Z)。我将对其进行编辑以使其更加清晰。
西蒙F

9

当在参数域中用网格对参数化曲面进行建模时,T型结很可能会在曲面中显示为不连续性。这些将显示为渲染中的间隙。见下文。

更一般而言,三角形网格中的T形结可能会导致插值属性(例如颜色和法线)不连续。

在此处输入图片说明 在此处输入图片说明



4

浮点舍入错误。

变换T结后,T中的点可以从边缘舍入。

然后可能会发生这样的情况:为一个像素采样的片段位于两个表面之间的间隙中。

可以通过首先不使用T型结来解决此问题。


3

避免这种情况的简单方法是确保所有顶点都被焊接

您的问题是,您已经沿着具有顶点的边缘进行了切割,但是在相邻的边缘上没有要焊接/连接的相应顶点,如果您将其视为衬衫上的纽扣,那么就将其播种在扣到边缘,但没有给它打孔,所以面料是开放的。

在下图中,红色点表示正确焊接的顶点,蓝色点都需要一个附加的顶点才能切入相邻的边。

在此处输入图片说明

一般来说,将您的模型保持在四边形和三边形是一个好习惯,这有助于减轻此问题,因为您也应该始终有一个对应的顶点也要焊接。如果您打算在网格上使用任何细分方法,也可以保持四边形。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.