如何实现图层之间投射的2D阴影?


10

如何实现由不同层中的对象投射的2D阴影?

不喜欢Catalin Zima著名教程中的动态照明:

在此处输入图片说明

但是就像这段视频中管道的阴影一样:

在此处输入图片说明

就像这个视频中平台的影子和角色一样:

在此处输入图片说明

我想在具有多个图层和许多不同颜色的灯光的场景中使用相同类型的照明。

我可以想象通过在该图层后面的图层上绘制该图层的黑色副本,然后根据要在其上投射阴影的图层中的孔进行调整来进行此操作。但是我希望有一种更便宜的基于像素着色器的方法。

Answers:


1

这可以通过掩膜来完成。有多种方法可以做到这一点。

一种方法是拥有一种渲染前景元素的阴影版本的方法。绘制背景。然后绘制前景元素,以仅输出黑色的方式,根据您希望照明的移动方式稍稍偏移。然后正常绘制前景。

另一种方法是将前景渲染到缓冲区中,比实际看到的要多一点。然后进行一些“黑化”传递,并进行模糊传递。现在,渲染这组通道的输出,然后渲染前景缓冲区的可见部分。

要支持不同角度的多个光源,您可以多次执行上一个步骤,也可以将它们全部累积在一个缓冲区中。数学运算会根据您要达到的目标而有所不同,但是,第一个视频的第一个猜测是,它们只是将光的位置与摄像头的位置(可见区域的中心)相对,并且然后使用该矢量(缩放比例)确定如何补偿阴影。就像是:

draw background
for each light intersecting viewing bounds:
  offset = light.position - camera.position
  offset *= SCALE FACTOR (0.25 maybe)
  draw shadow foreground at offset
draw foreground

“更接近”场景的灯光将具有较小的比例因子。如果您想要多个深度,则需要一些数学运算,简单的几何图形。


是的,这正是我自己想到的。不知道正确的术语是掩盖。但我希望有可能会是一个算法更类似于阴影体积在三维空间中如何工作..
贝瑞

将阴影投射到具有孔的表面上时,必须将常驻阴影投射到该表面后面的图层上。另外,使用透明性将变得有些棘手。我已经想到了解决这些问题的所有方法!但是我认为实时应用将变得太昂贵,尤其是在处理许多层(20)和许多灯光(50)时。这就是为什么我希望采用其他方法。
Berry
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.