【问题标题】:OpenGL- Simple 2D clipping/occlusion method?OpenGL-简单的 2D 裁剪/遮挡方法?
【发布时间】:2011-11-23 07:22:27
【问题描述】:

我正在开发一个相对较小的 2D(顶视图)游戏演示,使用 OpenGL 作为我的图形。它适用于基于隐身的基本角度,因此对于我所有的敌人,我正在绘制视线弧线,以便玩家知道他们在看哪里。

到目前为止,我的一个问题是,当我绘制这个视线弧(作为填充的多边形)时,它会自然地穿过屏幕上的任何墙壁,因为没有什么可以阻止它:

http://tinyurl.com/43y4o5z

我很好奇如何才能最好地防止此类事情发生。我确实已经有代码可以让我检测与墙壁等的线交点(用于敌人的视线检测),理论上我可以使用它来检测这种情况并相应地绘制多边形,但这很可能是相当繁琐和/或效率低下,所以我想如果有任何内置的 OpenGL 系统可以为我做到这一点,它可能会做得更好。

我曾尝试寻找有关剪辑/遮挡等主题的问题,但我什至不确定这些是否正是我应该寻找的;我的 OpenGL 技能有限。由于大量的单独墙壁等,使用 glClipPlanes 或 glScissor 的任何东西似乎都不适合此。

最后,这只是我在业余时间制作的一个演示,所以图形并不是我主要担心的问题。如果有一种(合理的)无痛方式可以做到这一点,那么我希望有人能指出我正确的方向;如果没有简单的方法,那么我可以暂时离开问题或寻找其他解决方法。

【问题讨论】:

  • 我实际上正在寻找类似的东西来处理自上而下的瓷砖游戏中的阴影。到目前为止,我的怀疑一直是光线投射(缓慢但完美)以及从遮挡物和某种阴影映射机制中创建蒙版。
  • 你考虑过只使用 OpenGL 光照吗?这可能意味着一些工作,但适当放置的灯可能会产生想要的效果。
  • @Keith:谢谢,这可能是个好主意。我在光照方面的经验也很有限,我可能需要对我的绘图代码进行一些调整才能使其正常工作。但如果没有更好的办法,我会记住这一点。
  • “OpenGL 光照”不处理阴影。所以它也会穿墙。您将不得不使用阴影映射或模板阴影或其他东西。
  • 据我所知,棘手的部分是将 2D 关卡转换为可用于在地图上投射阴影的东西(嗯)。另外,我还没有弄清楚它的成功之处。

标签: c++ opengl 2d


【解决方案1】:

这本质上是一个阴影问题。以下是我的做法:

对于圆弧边缘周围的每个点,追踪从敌人到该点的 (2D) 射线,寻找与绿色框的交点。如果绿色框总是与轴对齐,那么数学运算会容易得多(寻找 Ray-AABB 交点)。将交点渲染为三角形扇形将为您提供弧线。

正如你提到的,你已经有了线墙交叉代码,那么只要它会告诉你从敌人到墙的距离,那么你就可以将它用于瞄准弧。不要自动假设它会太慢 - 我们不再在 486 上运行。您始终可以减少圆弧边缘周围的点数以加快速度。

【讨论】:

  • 这听起来相当不错,虽然我还是有点担心速度。我的意思是,假设我在一张地图上最多有 10 个敌人,比如说每个敌人至少有 30 个弧点,比如说 25 面墙……那是 10 * 30 * 25 次交叉检查一帧,听起来很多处理器的工作效果比较简单。无论如何,这是一个很好的答案,我可能很快就会尝试一下。
  • 不要忘记spatial indexing,以减少您必须检查交叉路口的墙壁数量。
【解决方案2】:

OpenGL 的内置遮挡处理是为 3D 任务设计的,我想不出一种简单的方法来装配它来实现您所追求的效果。如果是我,我会解决这个问题的方法是使用片段着色器程序,但请注意,这绝对不属于“一种(合理)无痛的方法”。简而言之,您首先渲染一个二进制“遮挡贴图”,在有墙壁的地方为黑色,否则为白色。然后,您渲染“查看弧”,就像您当前使用片段程序所做的那样,该程序旨在从查看器向目标位置搜索,搜索遮挡物(黑色像素)。如果它找到一个遮挡物,那么它会将“观察弧”的那个像素渲染为 100% 透明。总的来说,虽然这是一个“正确”的解决方案,但我肯定会说这是一个复杂的功能,如果不实施它,你似乎还可以。

【讨论】:

  • 这将是昂贵,但它可以工作。不过,将它们绘制为透明可能比使用内置丢弃要慢。
  • 一个很酷的想法,并且可以用于像素级功能。 GPU 上会有相当多的负载,但如果瞄准弧覆盖屏幕的相对较小部分,那应该没问题。
【解决方案3】:

我想如果有任何内置的 OpenGL 系统可以为我做到这一点,它可能会做得更好。

OpenGL 是一个绘图 API,而不是几何处理库。

实际上,您的交集测试方法是正确的方法。但是,为了加快速度,您应该使用空间细分结构。在您的情况下,您需要 Binary Space Partitioning 树。 BSP 树有一个很好的特性,找到一条线与墙壁的交点的复杂度平均约为 O(log n),最坏的情况是 O(n log n),或者换句话说,BSP 树非常有效。有关详细信息,请参阅 BSP 常见问题解答http://www.opengl.org//resources/code/samples/bspfaq/index.html

【讨论】:

  • 我自己以前从来没有研究过 BSP 树,但是现在看它确实很有用。如果我最终使用 geofftnz 早期的建议(或者如果我以后发现我的碰撞系统缺乏),我可能会尝试实现它。
猜你喜欢
  • 2011-08-08
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 2012-07-10
相关资源
最近更新 更多