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

评论

请参阅stackoverflow.com/questions/21593786/…。

#1 楼

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


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



请注意,所有顶点可能都具有不准确性。尽管上面的示例显示了裂缝,但T型结可能会导致沿边缘的重叠,从而导致像素绘制两次。这看似不好,但可能会导致透明度或模版操作问题。

您可能会认为,使用浮点运算时,引入的错误将微不足道,但在渲染器中,屏幕空间顶点(X,Y)值几乎总是由定点数表示,因此距理想位置的位移通常会大得多。此外,随着渲染硬件以其自身的内部精度逐个像素“内插”线段,甚至更有可能偏离E的舍入位置。例如,通过将三角形ABC分为两个,即AEC和EBC,“去除”结,由于错误引入的偏移都将是一致的,问题将消失。

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

评论


$ \ begingroup $
当您说“顶点(X,Y)值几乎总是由定点数字表示”时,我猜您是指光栅器中屏幕空间顶点坐标,对吗?不是原始的模型空间顶点。
$ \ endgroup $
–内森·里德(Nathan Reed)
2015年9月9日在20:17



$ \ begingroup $
@NathanReed是的。只是屏幕空间X&Y(也许在某些GPU上是Z)。我将对其进行编辑以使其更加清晰。
$ \ endgroup $
–西蒙F
2015年9月10日下午5:41

#2 楼

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

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

评论


$ \ begingroup $
另请参见stackoverflow.com/questions/23530807/…。
$ \ endgroup $
–lhf
2015年9月9日,下午1:48

#3 楼

浮点舍入错误。

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

然后可能会发生被采样的像素位于2个表面之间的间隙中。

#4 楼

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

您遇到的问题是,您沿着具有顶点的边进行了切割,但是在相邻的边上没有对应的顶点要进行焊接/连接到它,如果您将它想成衬衫上的纽扣,就好像是在边上的纽扣上进行了播种,但没有给它打孔,所以织物是开放的。

在下面的图片中,红色圆点表示正确焊接的顶点,蓝色圆点都需要在相邻的边缘处切入一个附加的顶点。最好的做法是使建模保持在Quad&Tri中,这有助于缓解此问题,因为您也应该始终有相应的顶点需要焊接。如果您打算在网格上使用任何细分方法,它也有助于保持四边形。