2011-09-23 82 views
9

我正在做一个相对较小的2D(顶视图)游戏演示,使用OpenGL作为我的图形。这是一个基本的隐形角度,就像我所有的敌人一样,我正在画一条视线弧线,因此玩家知道他们在看什么。OpenGL-简单的2D裁剪/遮挡方法?

我的一个问题,到目前为止是,当我画这个景象弧(如填充多边形)就自然显示了通过屏幕上的任何墙壁,因为没有什么能阻止它:

http://tinyurl.com/43y4o5z

我我好奇我怎么可能最好能够防止这样的事情。我已经有了代码,可以让我检测与墙壁等的线交点(用于敌方视线检测),并且理论上我可以使用它来检测这种情况并相应地绘制多边形,但这可能是相当费力和/或效率低下,所以我认为如果有任何内置的OpenGL系统可以为我做到这一点,它可能会做得更好。

我试过寻找关于剪裁/咬合等话题的问题,但我甚至不确定这些是否正是我应该寻找的;我的OpenGL技能是有限的。似乎任何使用glClipPlanes或glScissor的东西都不适合这个,因为大量的单个墙壁等等。

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

+0

我实际上在寻找类似的东西来处理自上而下的游戏中的阴影。到目前为止,我的怀疑一直沿着光线投射(缓慢但完美)的路线,并从遮挡物和某种阴影映射式的机制创造出一个面具。 – ssube

+0

您是否考虑过使用OpenGL照明?这可能意味着一些工作,但适当的光线可能会带来想要的效果。 – Keith

+0

@凯斯:谢谢,这可能是一个好主意。我的照明经验也很有限,我可能需要对我的绘图代码进行一些调整才能使其工作。但如果没有什么更好的话,我会记住这一点。 – Linkage

回答

4

这实际上是一个阴影问题。以下是我如何去做的:

对于弧线边缘的每个点,从敌人向点追踪(2D)射线,寻找与绿色方框的交点。如果绿色方框始终与轴线对齐,则数学将变得更加容易(查找Ray-AABB交叉点)。将交点渲染为三角形风扇将为您提供弧线。

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

+0

这听起来相当不错,但我仍然有点关心速度。我的意思是,假设我在一张地图上有多达10个敌人,例如每个敌人至少有30个弧点,并说25个墙壁......这是10 * 30 * 25交叉检查一帧,听起来像很多处理器工作的效果相对较为简单。无论如何,这是一个很好的答案,我可能会尽快试一试。 – Linkage

+2

不要忘记[空间索引](http://en.wikipedia.org/wiki/Spatial_database#Spatial_Index)以减少墙壁的数量,您必须检查交叉点。 – genpfault

+0

@genpfault是的,绝对。 – geofftnz

4

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

+1

这将是*昂贵*,但它可以工作。不过,将它们绘制为透明可能比使用内置丢弃要慢。 – ssube

+0

非常酷的想法和一个将工作到像素级功能。 GPU上会有相当大的负载,但是如果瞄准弧覆盖屏幕的相对较小部分,则应该没问题。 – geofftnz

4

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

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

其实你的交集测试方法是正确的方法来做到这一点。但是为了加速它,你应该使用空间细分结构。在你的情况下,你有什么东西是哭的二进制空间分区树。 BSP树具有很好的属性,找到一条线与墙的交点的复杂度平均约为O(log n),最坏的情况是O(n log n),或换句话说BSP tress是非常有效。有关详细信息,请参阅BSP FAQ http://www.opengl.org//resources/code/samples/bspfaq/index.html

+0

以前从来没有看过BSP树,但现在看它看起来确实非常有用。如果我最终使用geofftnz的早期建议(或者如果我发现我的碰撞系统稍后缺乏),我可能会尝试实施它。 – Linkage