我正在进行一场2D游戏。想象一下XY平面,你就是一个角色。随着角色的行走,场景的其余部分进入视野。

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

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

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

我想最简单的方法是计算位置,然后在距离太远的情况下不绘制那个立方体/物体。

有帮助吗?

解决方案

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

如果您将对象组织成一个合理的层次结构,那么只需一次框检查就可以剔除场景的大部分。

其他提示

关于“剪切,剔除和可见性测试”的 OpenGL常见问题解答 ;这样说:

  

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

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

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

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

显然在一个复杂的游戏中,你不会想要为每一个微小的物体做这个,所以通常是分层次地对它们进行分组(例如,如果你已经确定了你就不会渲染一把枪“不会渲染持有它的角色”,空间(例如,将世界划分为网格/四叉树/ octree 并拒绝您知道的任何对象,您已经确定的区域当前是不可见的,或者更常见的是两者的组合。

“唯一的胜利之举不是玩”

无论是否最终在屏幕上呈现,每个glVertex等都会受到性能影响。绕过它的唯一方法是不绘制(即剔除)无论如何都不会被渲染的物体。

最常见的方法是将查看视锥体绑在相机上。与 octtree quadtree 取决于你的游戏是否为3d / 2d,所以你不需要检查每个游戏对象与平截头体。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top