如果是这种情况,即使多边形以不同的顺序发送,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。这自然也会影响帧缓冲区值。
评论
TL; DR-Z缓冲区保留距离相机最近的多边形的深度。在帧的最后,所有其他条件都相同,最近的多边形是最近的多边形,因此深度绘制值将相同,而与绘制顺序无关。在渲染结束时,帧缓冲区可能包含不同的值,但是,如果您没有使用Z测试模式,则Z缓冲区应该保持一致。