二维等距游戏中的实时阴影投射


15

我正在用C ++写一个小的2D等距引擎,并且试图实现实时阴影投射。我按照本页上描述的一种简单方法进行操作,结果是(光与黄色立方体位于同一位置):

在此处输入图片说明

结果非常好,但是在墙壁和立方体顶部缺少阴影。这是一个看起来像的示例(我用绿色绘制了预期的阴影):

在此处输入图片说明

所有绘制的立方体仅由位于XY位置且Z深度(z = x + y)的3个2D方形构成。我将OpenGL与正交矩阵(glOrtho)结合使用。使用模板缓冲区绘制阴影。

我正在寻找可以帮助我完成此影子投射实施的资源或解决方案。

非常感谢!


5
您指向“此页面”的链接指向图像而不是页面。另外,我只是在这里猜测,但是以3D方式解决该问题并仅以等距方式投影相机可能会更容易。
四分

糟糕,您是对的,我已修复了链接。使用3D投影当然会更容易,但是2D也有其优势,我敢肯定,有解决方案可以在2D中实现。
XPac27 2011年

Answers:


6

对于屋顶和墙壁,您可以尝试确定墙壁线段和生成的阴影区域之间的交点。您需要两次通过阴影渲染。第一个将执行您今天的工作(在内存中)。第二遍将计算屋顶和墙壁的交点。最后阶段是真实渲染。DeadMG是错误的,您可以这样做。

注意:对于屋顶,您必须将阴影区域和屋顶区域相交。


谢谢您的好建议!如果可以通过检查应使用墙段的点积与阴影段的点积来计算哪些墙,可以优化第二遍。我会尝试一下,并在可行的情况下发回。
XPac27 2011年

已经有一段时间了,但是由于您的建议,我终于使它起作用了!我只需要2种几何方法(一种方法可以知道一个点是否在多边形内,一种方法可以得到两个线段的交集)。我仍然需要处理屋顶,但是看起来很容易知道。您可以在此视频上观看结果,并在此处查看源代码(我只用了1天的时间,因此有可能对其进行更多优化)。
XPac27

@ XPac27太神奇了。感谢分享。
ashes999

0

从根本上讲,您要找的东西无法完成。您想获取一堆2D对象并让它们像3D对象一样投射阴影。如果要具有完整的3D阴影,则需要具有3D对象。


1
但这不是问题中的3d阴影投射。任何一堵墙都完全阻挡了该方向上的视线,因此您不能拥有高度可变的物体。
yuriks 2011年

0

描述的解决方案不是完整的3d,因为他不需要完整的3d解决方案。它看起来像,但事实并非如此。阴影投射的创建必须视为体积之间的交集。他所需要的并不那么复杂。记住(如果有知识的话)厄运和厄运之类的渲染引擎。所有处理都在二维上进行。


0

假设您希望这款游戏小巧,那么仅说当前的影子实现就足够了?

我承认我还没有见过这种效果,也就是说,当这款游戏在动态对象和动态光源下运行但从您的图像来看时,我还没有看到阴影瑕疵会多么令人不安或不受干扰。我很想说“这已经足够好了,现在集中精力完成游戏”。如果当前的实现恰好很小并且执行得快并且解决了您认为的问题将使代码变大和变慢,那么我认为您最好不要担心那些阴影。

我知道,我建议将“不要尝试解决问题”作为解决问题的方法可能是一种不好的做法。不过,老实说,如果您希望代码占用的空间很小,那确实很好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.