Opengl深度缓冲和剔除

时间:2010-02-16 21:40:11

标签: opengl culling

在OpenGL中使用背面剔除和深度缓冲之间的区别是什么?

2 个答案:

答案 0 :(得分:10)

背面剔除是指OpenGL确定哪些面背向观察者,因此是看不见的。想想一个立方体。无论你如何旋转立方体,3个面都将永远不可见。弄清楚这些面临哪些面,将它们从要绘制的多边形列表中删除,你只需将绘图列表减半。

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

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

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

答案 1 :(得分:6)

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

深度缓冲区(z-buffer)用于挂起已经渲染的最接近的东西(深度相对于视图)。如果绘图列表中下一个出现的东西是我已经绘制过的东西(也就是说,它有一个深度使它更远)我可以跳过绘制它,因为它被阻挡了。如果要绘制的新东西更接近,我绘制它并使用新的更接近的值更新深度缓冲区。