简单的2D裁剪/遮挡方法

OpenGL- Simple 2D clipping/occlusion method?

本文关键字:遮挡 方法 裁剪 2D 简单      更新时间:2023-10-16

我正在制作一个相对较小的2D(俯视图)游戏演示,使用OpenGL作为我的图像。这是一个基于潜行的基本角度,对于我的所有敌人,我都画了一个视线弧线,这样玩家就知道他们在看哪里。

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

http://tinyurl.com/43y4o5z

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

我试着寻找诸如剪切/闭塞等主题的问题,但我甚至不确定这些是否正是我应该寻找的;我的OpenGL技能有限。似乎任何使用glClipPlanes或glScissor的东西都不适合这种情况,因为有大量的独立墙壁等。

最后,这只是我在业余时间做的一个演示,所以图像并不是我主要担心的。如果有一种(合理的)无痛的方法来做到这一点,那么我希望有人能给我指出正确的方向;

如果没有简单的方法,那么我可以暂时不处理这个问题或寻找其他解决方法。

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

对于你的弧线边缘的每个点,追踪从敌人到该点的(2D)光线,寻找与绿色盒子的交点。如果绿色的方框总是与坐标轴对齐,数学运算就容易多了(寻找Ray-AABB的交集)。将交点渲染为三角形扇形,可以得到圆弧。

正如你所提到的,你已经有了线墙相交的代码,那么只要它能告诉你敌人到墙的距离,那么你就可以使用它来瞄准弧。不要想当然地认为它会太慢——我们不再运行486了。你总是可以减少圆弧边缘的点的数量来加快速度。

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

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

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

实际上你的交叉测试方法是正确的。然而,为了加快速度,你应该使用空间细分结构。在您的情况下,您需要一个二进制空间分区树。BSP树有一个很好的特性,寻找与墙相交的线的复杂度平均约为O(log n),最坏的情况是O(n log n),换句话说,BSP树是非常有效的。详细信息请参见BSP FAQ http://www.opengl.org//resources/code/samples/bspfaq/index.html