代码之家  ›  专栏  ›  技术社区  ›  Berlin Brown

OpenGL游戏开发-远观的场景

  •  1
  • Berlin Brown  · 技术社区  · 15 年前

    我正在做一个二维游戏。想象一个xy平面,你就是一个角色。当你的角色行走时,其他的场景就会出现。

    假设xy平面相当大,并且当前视图之外还有其他字符。

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

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

    我想最简单的方法是计算位置,如果离得太远,就不要画出立方体/物体。

    5 回复  |  直到 15 年前
        1
  •  3
  •   ChrisF    15 年前

    如果已经正确设置了场景图,那么应该在显示管道的早期剔除视图外的对象。它需要在代码中选中一个复选框来验证对象是否不可见,因此会有一些处理开销(但不会有太多)。

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

        2
  •  7
  •   Breton    15 年前

    OpenGL faq 在“剪切、剔除和可见性测试”中,这样说:

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

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

        3
  •  0
  •   Kylotan    15 年前

    通常,应用程序必须执行这些优化——OpenGL实际上只是呈现部分,不执行对象管理或类似的任何操作。如果你输入一些看不见的东西的数据,它仍然需要将相关的坐标转换成视图空间,然后才能确定它完全脱离屏幕或超出你的一个裁剪平面。

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

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

        4
  •  0
  •   Krypes    15 年前

    “唯一的胜利是不玩”

    无论最终是否在屏幕上渲染,每个glvertex等都将成为性能冲击。唯一的解决方法是不绘制(即剔除)任何情况下都不会渲染的对象。

    最常见的方法是 viewing frustum 绑在你的相机上。把它和一个 octtree quadtree 取决于你的游戏是否是3D/2D的,所以你不需要检查每一个游戏对象与截锥。

        5
  •  0
  •   Jim Buck    15 年前

    基础驱动因素 可以 在幕后进行一些剔除,但是你不能依赖于它,因为它不是OpenGL标准的一部分。也许你的电脑的驱动程序会这样做,但也许其他人(可能会运行你的游戏)不会这样做。最好是你自己动手挑选。