Как мне реализовать 2D тени, отбрасываемые между слоями?

10

Как я могу реализовать 2d тени, которые отбрасываются объектами в другом слое?

НЕ нравится динамическое освещение в известном уроке от Catalin Zima :

введите описание изображения здесь

Но, как тени труб в этом видео :

введите описание изображения здесь

И как тень от платформы и персонажа в этом видео :

введите описание изображения здесь

Я хотел бы использовать один и тот же вид освещения в сцене с множеством слоев и множеством источников света разных цветов.

Я мог бы представить себе, делая это, рисуя черную копию слоя над слоями за этим слоем, и подстраивая его под отверстия в слоях, на которые отбрасывается тень. Но я надеюсь, что для этого есть менее дорогой подход на основе пиксельных шейдеров.

Ягода
источник

Ответы:

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). Вот почему я надеялся на другой подход.
Берри