对于Frustum Culling感到困惑

时间:2010-09-27 20:50:47

标签: java opengl graphics jogl frustum

我是OpenGL的新手。我和JOGL一起使用它。

我正在阅读截头剔除:

http://www.lighthouse3d.com/opengl/viewfrustum/

http://www.crownandcutlass.com/features/technicaldetails/frustum.html

我不确定它应该做什么。 OpenGL不会自动剔除屏幕外对象吗? (这种剔除是否明显慢于不首先发送对象?)

从我正在阅读的内容来看,这看起来并不像是避免绘制被遮挡在另一个之后但在视锥之内的对象。这是否意味着唯一的好处是避免将屏幕外对象发送到OpenGL?

4 个答案:

答案 0 :(得分:4)

是的,你基本上是对的。 Frustum剔除会切断相机金字塔外的物体。当渲染场景时,OpenGL当然也会这样做,但是基于每个顶点。因此,每个物体的剔除效果及其性能提升潜力要高得多 其中一个瓶颈是在CPU和GPU之间传输数据。如果你只需要在室外场景中传输所有对象/顶点的1/4,则截头锥体剔除可以提高性能。

答案 1 :(得分:3)

最快的对象是你根本不需要绘制的对象。

通常,对于尚未简单的对象,您将提供简化的保守边界体积。这样,你可以在不处理复杂对象中的每个三角形的情况下进行截头剔除。

避免相互遮挡的绘图对象称为遮挡剔除。遮挡剔除通常比截头剔除更复杂;但请注意,它仍然可以使用相同的简化边界体积。

答案 2 :(得分:3)

是的 - 视锥体剔除只是会移除完全位于视锥体之外的物体。没有更多或更少。是的,您可以提高OpenGL本身的性能,特别是如果您可以同时剔除大量项目(例如,视图库可能能够相当快地切断图表的整个分支)。

还有 面对剔除,它会移除背离观察者的三角形(或其他),但这与截头剔除是分开的。

有两种处理被其他对象遮挡的对象的方法。遮挡剔除是最简单的,但OpenGL没有直接支持它(尽管某些硬件作为扩展)。另一个是深度缓冲区 - OpenGL直接支持。不同之处在于遮挡剔除会查看整个对象,如果它完全被遮挡则根本不会渲染它。深度缓冲区在逐个片段的基础上工作,因此它只在您(几乎)完全渲染对象后才会发生。根据您正在处理的对象(等等)进行自己的遮挡剔除可能是一个相当大的胜利(因为它可以避免在深度缓冲区可以执行其操作之前进行大量渲染)。

答案 3 :(得分:1)

当您在代码中进行视锥检查时,可以使用包围正在绘制的对象的简单几何体来执行此操作。这可以比试图剔除每个三角形的卡快得多。