使用Z缓冲区与根据深度优先考虑像素的优点

时间:2011-03-24 12:50:17

标签: opengl graphics zbuffer

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

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

在前几天的一次演讲中,我的教授表示,按照深度值对像素进行优先排序是计算效率低下的。然后他给我们简要解释了Z缓冲区以及它们如何测试像素的深度值,并将它们与缓冲区中像素的深度值进行比较。这有什么不同,然后'根据深度优先考虑像素'。

谢谢!

2 个答案:

答案 0 :(得分:6)

确定片段所属的多边形是非常昂贵的,因为这需要为每个像素找到最接近的多边形(并且在像素着色期间可以获得整个几何信息!)。

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

这是z缓冲区的用武之地。如果事实证明片段的计算深度大于已经存储在z缓冲区中的深度,则表示片段“落后于某物”,因此它被丢弃。否则,将片段写入颜色缓冲区,并将深度值写入z缓冲区。当然这意味着当20个三角形相互在后面时,相同的像素将被遮蔽19次是徒劳的。唉,运气不好。

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

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

编辑:虽然这可能是显而易见的,但我不确定我是否明确表达了这一点:在进行z-culling的排序时,你会做完全相反的你做的事情画家的算法。你想要最先绘制的东西(粗略地,不必100%精确),所以不是在“最后一个人站立”的意义上确定一个像素的最终颜色,而是在“先到先得”的意义上服务,只有一个服务“。

答案 1 :(得分:3)

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