4

在OpenGL中使用背面剔除和深度缓冲区有什么区别?

4

2 回答 2

11

背面剔除是指 OpenGL 确定哪些面背对观察者并因此不可见。想想一个立方体。无论您如何旋转立方体,3 个面将始终不可见。找出这些是哪些面,将它们从要绘制的多边形列表中删除,然后您将绘图列表减半。

深度缓冲相当简单。对于绘制的每个多边形的每个像素,将其 z 值与 z 缓冲区进行比较。如果它小于 z 缓冲区中的值,则将 z 缓冲区值设置为新的 z 缓冲区值。如果不是,则丢弃该像素。深度缓冲提供了非常好的结果,但可能会相当慢,因为每个像素都需要一个值查找。

实际上,这两种方法之间没有任何相似之处,并且通常都使用它们。给定一个立方体,您可以先使用剔除切出一半多边形,然后使用 z 缓冲绘制它们。

剔除可以减少渲染的多边形,但它不是一种排序算法。这就是 Z 缓冲。

于 2010-02-16T21:52:30.053 回答
6

一个给定的三角形有两条边,正面和背面。您正在查看的一侧取决于点在顶点列表中出现的顺序(也称为绕组)。通常,三角形列表具有交替缠绕,因此您可以重复使用前面的两个点,但条带中给定三角形的面不会交替。背面剔除是优化步骤,其中场景中远离视图的三角形从要绘制的三角形列表中删除。

深度缓冲区(z-buffer)用于挂在已经渲染的最近的事物(深度是相对于视图)上。如果绘制列表中接下来出现的东西在我已经绘制的东西的后面(即,它的深度使它更远)我可以跳过绘制它,因为它被阻挡了。如果要绘制的新东西更接近,我会绘制它并使用新的更接近的值更新深度缓冲区。

于 2010-02-16T21:51:04.003 回答