5

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

我正在阅读有关截锥体剔除的信息:

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

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

我不确定它应该做什么。OpenGL 不会自动剔除屏幕外对象吗?(这种剔除是否比一开始不发送对象要慢得多?)

从我正在阅读的内容来看,这似乎不会处理避免绘制在另一个后面但在视锥内的对象。这是否意味着唯一的好处是避免将屏幕外对象发送到 OpenGL?

4

4 回答 4

4

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

于 2010-09-27T20:59:56.773 回答
3

最快的对象是您根本不必绘制的对象。

通常,对于已经不是很简单的对象,您将提供一个简化的、保守的包围体。这样,您可以进行平截头体剔除,而无需处理复杂对象中的每个三角形。

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

于 2010-09-27T21:00:57.170 回答
3

是的——截锥体剔除只是移除完全位于视锥体之外的对象。没有更多或更少。是的,您可以潜在地提高 OpenGL 本身的性能,特别是如果您可以一次剔除大量项目(例如,视图库可能能够相当快地切断图形的整个分支)。

还有面部剔除可以删除背对观察者的三角形(或其他任何东西),但这与平截头体剔除是分开的。

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

于 2010-09-27T21:06:57.163 回答
1

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

于 2010-09-27T20:59:52.753 回答