2009-09-16 50 views
1

我正在进行2D游戏。想象一下一个XY平面,你是一个角色。随着角色走动,场景的其他部分进入视野。OpenGL游戏开发 - 跨越视野的场景

想象一下,XY平面非常大,并且当前视图之外还有其他字符。

这是我的问题,用opengl,如果这些对象不是在当前视图之外渲染的,他们会吃掉处理时间吗?

此外,有什么方法可以避免渲染场景中的部分不在视图中。如果我有一个距离当前位置1000个单位的立方体,我不想渲染这个对象。我怎么可能让opengl没有渲染。

我想最简单的方法是计算位置,然后不绘制该立方体/对象,如果它太遥远。

回答

3

如果您已经正确设置了场景图,则应该尽早在显示管道中选取视野外的对象。它需要在你的代码中检查盒子来验证对象是不可见的,所以会有一些处理开销(但不是很多)。

如果您将对象组织为明智的层次结构,那么您只需一次检查就可以清除大部分场景。

7

OpenGL faq的“裁剪,剔除和可见性测试”这样说:

的OpenGL提供了用于确定给定原始是否会在场景中可见对于给定的观点没有直接的支持。最糟糕的情况是,应用程序需要手动执行这些测试。上一个问题包含有关如何执行此操作的信息。

继续阅读该链接的其余部分,它都是相关的。

0

通常,您的应用程序必须执行这些优化 - OpenGL实际上只是渲染部分,并且不执行对象管理或类似的任何操作。如果您传递数据以获取不可见的东西,则必须先将相关坐标转换为视图空间,然后才能确定它完全在屏幕外或超出其中一个剪辑平面。

有几种从管道中剔除不可见对象的方法。检查相机后面是否有对象可能是最容易且最便宜的检查,因为通过每个对象的简单计算,您可以平均拒绝一半的数据集。对实际视图进行相同的测试并不难,因为它拒绝一切看不见的东西。

很显然,在一个复杂的游戏中,你不会希望为每一个小物体做这件事,所以通常将它们分组,不管是分层的(例如,如果你已经确定你不是渲染持有它的角色),空间上(例如,将世界划分成网格/四叉树/ octree并拒绝任何你知道在你已经确定的区域内的对象当前是不可见的)或更多通常是两者的组合。

0

“的唯一获奖的举动是不是打”

每glVertex等将是一个性能无论它最终得到你的屏幕上呈现的打击。解决这个问题的唯一方法是不要绘制(即剔除)无论如何都不会呈现的对象。

最常见的方法是将viewing frustum绑定到您的相机。再加上octtreequadtree,这取决于你的游戏是3d/2d,所以你不需要检查每一个游戏对象的锥体。

0

底层驱动程序可能在幕后做了一些剔除,但是你不能依赖它,因为它不是OpenGL标准的一部分。也许你的电脑的驱动程序这样做,但也许别人的(谁可能运行你的游戏)不会。你最好自己去挑选。