2010-09-27 163 views
5

我是OpenGL的新手。我正在使用JOGL。对Frustum Culling感到困惑

我念叨平截面消隐:

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

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

我不知道到底是什么应该做的。 OpenGL不会自动挑选离屏对象吗? (这种剔除比仅仅不发送对象的速度慢得多)

从我正在阅读的内容看,它看起来并不像这样可以避免在另一个背景中被遮挡的绘图对象,观看平截头体。这是否意味着唯一的好处是避免将离屏对象发送给OpenGL?

+0

第二个链接保存我的一天,谢谢! :-) – 2014-01-03 17:56:04

回答

1

当你做了你在代码中的平截头体检查时,你使用简单的几何体来包装被绘制的对象。这可以比试图剔除每个三角形的卡快得多。

4

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

3

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

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

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

3

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

还有也面临淘汰,去除了面向观众的三角形(或其他),但这是与平截体剔除分开的。

有几种处理被其他对象遮挡的对象的方法。遮挡剔除是最简单的,但OpenGL不直接支持它(尽管一些硬件可以作为扩展)。另一个是深度缓冲区 - OpenGL直接支持。不同之处在于遮挡剔除会查看整个对象,如果完全遮挡,则根本不会呈现它。深度缓冲区在逐个片段的基础上工作,所以它只发生在(几乎)完全渲染对象之后。取决于处理多少个对象(以及这样做),自己进行遮挡剔除可能会是一个非常大的胜利(因为它可以避免在深度缓冲区可以完成之前进行大量渲染)。