我知道当我们使用Z缓冲区消除隐藏的面孔时,多边形可以按任何顺序排列。但是我的老师说,这并不意味着通过以不同顺序发送多边形而生成的两个图像在其z缓冲区和帧缓冲区中将具有相同的值。这是怎么发生的?
如果是这种情况,即使多边形以不同的顺序发送,z缓冲区和帧缓冲区何时或如何具有相同的值?

评论

TL; DR-Z缓冲区保留距离相机最近的多边形的深度。在帧的最后,所有其他条件都相同,最近的多边形是最近的多边形,因此深度绘制值将相同,而与绘制顺序无关。
在渲染结束时,帧缓冲区可能包含不同的值,但是,如果您没有使用Z测试模式,则Z缓冲区应该保持一致。

#1 楼

您的老师的意思是,在帧的末尾,一旦绘制了场景中的所有多边形,z缓冲区将具有相同的值。这是因为z缓冲区会在绘制到该像素的所有多边形上的每个像素内保持最小的Z值,并且最小值不取决于顺序。

如果您查看z-在帧中间的缓冲区中,当绘制了一些多边形(但不是全部)时,z缓冲区的内容自然将取决于到目前为止所绘制的内容,这通常将取决于顺序。 >
关于颜色缓冲区,如果每个像素内的所有Z值都不同,则情况相同。但是,在某些情况下,结果确实取决于顺序:当多个多边形在给定像素处具有相同的Z值时。如果将相同的多边形用不同的颜色渲染两次,或者使用某些类似的颜色,则可能会发生这种情况。然后,其行为取决于深度测试的设置(即OpenGL中的glDepthFunc)。如果严格“小于”,则绘制的第一个具有最小Z的多边形将“获胜”,并且其颜色最终将在最后的颜色缓冲区中。但是,如果将深度测试设置为“次等”,则每个具有最小Z的多边形将覆盖之前的那个,最后绘制的一个多边形将最终位于颜色缓冲区的最后。因此,在这种情况下,绘制多边形的顺序以及深度测试的状态确实有所不同。

评论


$ \ begingroup $
我想知道他的老师是否指的是浮点运算的不确定性?不知道这是否真的发生在GPU上,但我可以看到它可能正在发生。但是,这是一件非常晦涩的事情,所以可能不太在说什么?
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
16-10-6的2:00

$ \ begingroup $
@AlanWolfe我想这可能会发生在浮点渲染目标上。不确定整数格式(即使是混合格式)是否存在问题。
$ \ endgroup $
–内森·里德(Nathan Reed)
16-10-6在2:35

#2 楼

如果使用Alpha混合,则即使使用深度写入和测试,渲染多边形的顺序也很重要。例如。假设您渲染两个具有50%不透明度的三角形A(红色)和B(蓝色),其中较小的三角形B在A的前面。如果在B之前渲染A,则B将显示为紫色,但是如果在B之前在A之前渲染B将显示为深蓝色(三角形重叠的地方不会渲染A的像素)。

但是,如果使用不透明渲染,则帧缓冲区的值将与渲染顺序相同,但在Nathan提到了特殊情况,其中两个三角形的深度值相等。例如。当渲染A时,模板测试通过并向模板缓冲区写入一个值,这会使B失败,从而仅使三角形A可见。但是,如果在A之前渲染B,那么您会在A之前看到B。这自然也会影响帧缓冲区值。

#3 楼

尽管可以以任何顺序发送多边形,但某些多边形可能位于同一平面上。可以使用公式z =(-Ax-By-D)/ C计算它们各自的zs,如果两个多边形表面的深度相同,则它们可以具有相同的z值。