2

这更像是一个学术问题。事实上,我正在准备考试,我只是想真正理解这个概念。

请允许我稍微解释一下上下文。手头的问题是在绘制到屏幕时将对象(或更具体地说是多边形)隐藏在彼此后面。需要进行计算以决定哪一个被最后绘制,因此被排在最前面。

在前几天我的一次讲座中,我的教授说根据像素的深度值对像素进行优先级计算在计算上是低效的。然后,他向我们简要介绍了 Z 缓冲区以及它们如何测试像素的深度值并将它们与缓冲区中像素的深度值进行比较。这与“根据深度优先考虑像素”有何不同。

谢谢!

4

2 回答 2

6

确定片段属于哪个多边形在计算上是昂贵的,因为这需要为每个像素找到最近的多边形(并且在像素着色期间具有可用的整个几何信息!)。

对整个对象进行排序很容易,几乎是微不足道的,每个对象根据它们的深度由许多三角形组成(一个多边形不超过一个或几个三角形)。然而,这只是一个粗略的近似,附近的物体会重叠并产生伪影,因此需要做一些事情来使其像素完美。

这就是 z 缓冲区的来源。如果一个片段的计算深度大于 z 缓冲区中已经存储的深度,这意味着该片段“落后于某些东西”,所以它被丢弃。否则,片段被写入颜色缓冲区,深度值被写入 z 缓冲区。当然,这意味着当 20 个三角形彼此落后时,那么同一个像素将被白白着色 19 次。唉,运气不好。

现代图形硬件通过在实际着色像素之前根据三角形顶点的插值深度进行 z 测试来解决这个问题(如果计算每像素深度,这种优化显然是不可能的)。

此外,他们采用保守的(有时是分层的,有时只是平铺的)优化,可以快速丢弃整个片段组。为此,z-buffer 保存了一些额外的(你不知道的)信息,例如渲染到 64x64 矩形区域的最大深度。有了这些信息,它可以立即丢弃该屏幕区域中任何大于该值的片段,而无需实际查看存储的深度,并且可以完全丢弃属于所有顶点都具有更大深度的三角形的任何片段。因为,显然,它不可能是可见的。
不过,这些是实现细节,并且非常特定于平台。

编辑:虽然这可能很明显,但我不确定我是否足够清楚地说明这一点:当排序以利用 z 剔除时,你会做与画家算法完全相反的事情。您希望首先绘制最接近的东西(粗略地说,不必是 100% 精确),因此不是在“最后一个人站立”的意义上确定像素的最终颜色,而是在“先到先得”的意义上确定它送达,而且只送达一份”。

于 2011-03-24T13:15:38.457 回答
3

您需要了解的第一件事是您的教授所说的“根据深度优先考虑像素”是什么意思。我的猜测是,它是关于存储给定屏幕像素的所有请求片段,然后通过选择最接近的片段来产生结果颜色。这是低效的,因为 Z 缓冲区只允许我们存储单个值而不是所有值。

于 2011-03-24T13:15:59.163 回答