我正在开发一款 2d 游戏。想象一个 XY 平面,你是一个角色。当你的角色走路时,场景的其余部分就会出现。
想象一下,XY 平面非常大,并且在当前视图之外还有其他角色。
这是我的问题,对于opengl,如果这些对象没有在当前视图之外渲染,它们会占用处理时间吗?
此外,有哪些方法可以避免渲染不在视图中的部分场景。如果我有一个距离当前位置 1000 单位的立方体,我不希望渲染该对象。我怎么能让opengl不渲染它。
我想最简单的方法是计算位置,然后如果它太远就不要绘制那个立方体/对象。
OpenGL faq on "Clipping, Culling and Visibility Testing" 说:
OpenGL 不直接支持确定给定图元在给定视点的场景中是否可见。在最坏的情况下,应用程序将需要手动执行这些测试。上一个问题包含有关如何执行此操作的信息。
继续阅读该链接的其余部分,这都是相关的。
如果您已正确设置场景图,则应尽早在显示管道中剔除视野之外的对象。它需要在您的代码中进行复选框检查以验证对象是否不可见,因此会有一些处理开销(但不会太多)。
如果你将你的对象组织成一个合理的层次结构,那么你可以只用一个复选框来剔除场景的大部分。
通常,您的应用程序必须执行这些优化 - OpenGL 实际上只是渲染部分,不执行对象管理或类似的事情。如果您为不可见的东西传递数据,它仍然必须将相关坐标转换到视图空间,然后才能确定它完全在屏幕外或超出您的剪辑平面之一。
有几种方法可以从管道中剔除不可见的对象。检查一个物体是否在相机后面可能是最简单和最便宜的检查,因为您可以通过对每个物体的简单计算平均拒绝一半的数据集。对实际视锥执行相同类型的测试以拒绝所有不可见的东西并不难。
显然,在一个复杂的游戏中,您不希望对每个微小的对象都这样做,因此通常将它们分组,或者分层(例如,如果您已经确定自己不是,则不会渲染枪)渲染持有它的角色),空间(例如,将世界划分为网格/四叉树/八叉树并拒绝任何您知道在您已经确定当前不可见的区域内的对象),或更常见的组合两个都。
底层驱动程序可能会在幕后进行一些剔除,但您不能依赖它,因为它不是 OpenGL 标准的一部分。也许您计算机的驱动程序会这样做,但也许其他人(可能会运行您的游戏)的驱动程序不会。最好是你自己剔除。