1

我正在开发一款 2d 游戏。想象一个 XY 平面,你是一个角色。当你的角色走路时,场景的其余部分就会出现。

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

这是我的问题,对于opengl,如果这些对象没有在当前视图之外渲染,它们会占用处理时间吗?

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

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

4

5 回答 5

7

OpenGL faq on "Clipping, Culling and Visibility Testing" 说:

OpenGL 不直接支持确定给定图元在给定视点的场景中是否可见。在最坏的情况下,应用程序将需要手动执行这些测试。上一个问题包含有关如何执行此操作的信息。

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

于 2009-09-16T22:01:04.113 回答
3

如果您已正确设置场景图,则应尽早在显示管道中剔除视野之外的对象。它需要在您的代码中进行复选框检查以验证对象是否不可见,因此会有一些处理开销(但不会太多)。

如果你将你的对象组织成一个合理的层次结构,那么你可以只用一个复选框来剔除场景的大部分。

于 2009-09-16T22:04:01.690 回答
0

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

有几种方法可以从管道中剔除不可见的对象。检查一个物体是否在相机后面可能是最简单和最便宜的检查,因为您可以通过对每个物体的简单计算平均拒绝一半的数据集。对实际视锥执行相同类型的测试以拒绝所有不可见的东西并不难。

显然,在一个复杂的游戏中,您不希望对每个微小的对象都这样做,因此通常将它们分组,或者分层(例如,如果您已经确定自己不是,则不会渲染枪)渲染持有它的角色),空间(例如,将世界划分为网格/四叉树/八叉树并拒绝任何您知道在您已经确定当前不可见的区域内的对象),或更常见的组合两个都。

于 2009-09-18T18:07:32.650 回答
0

“唯一的制胜法宝就是不玩”

无论最终是否在您的屏幕上呈现,每个 glVertex 等都会对性能造成影响。解决这个问题的唯一方法是不绘制(即剔除)无论如何都不会被渲染的对象。

最常见的方法是将视锥体连接到您的相机。将它与叉树或四叉树结合起来,具体取决于您的游戏是 3d/2d,因此您无需检查每个游戏对象与截锥体。

于 2009-09-18T19:18:15.357 回答
0

底层驱动程序可能会在幕后进行一些剔除,但您不能依赖它,因为它不是 OpenGL 标准的一部分。也许您计算机的驱动程序会这样做,但也许其他人(可能会运行您的游戏)的驱动程序不会。最好是你自己剔除。

于 2009-09-18T19:23:44.167 回答