Тень в реальном времени в 2D-изометрической игре

15

Я пишу небольшой двухмерный изометрический движок на C ++ и пытаюсь реализовать отбрасывание теней в реальном времени. Я следовал простому подходу, описанному на этой странице, и вот результат (свет расположен в том же положении, что и желтый куб):

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

Результат очень хороший, но на стенах и кубиках отсутствуют тени. Вот пример того, как это должно выглядеть (я нарисовал ожидаемые тени зеленым цветом):

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

Все нарисованные кубы просто состоят из 3-х четырехугольников, расположенных в позиции XY и с глубиной Z (z = x + y). Я использую OpenGL с орфографической матрицей (glOrtho). Тени рисуются с помощью буфера трафарета.

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

Большое спасибо!

XPac27
источник
5
Ваша ссылка на "эту страницу" указывает на изображение, а не на страницу. Кроме того, я просто догадываюсь здесь, но может быть проще решить эту проблему в 3D и просто изометрически проецировать камеру.
Тетрад
Упс, вы правы, я исправил ссылку. Конечно, было бы проще с 3D-проекцией, но у 2D есть и свои преимущества, и я уверен, что есть решения для реализации этого в 2D.
XPac27

Ответы:

6

Для крыши и стен вы можете попытаться определить пересечения между вашими сегментами стены и сгенерированными областями теней. Вам нужно два прохода рендеринга ваших теней. Первый будет делать то, что вы делаете сегодня (в памяти). Второй проход рассчитает пересечения крыши и стены. Последний этап - реальный рендеринг. DeadMG не прав, вы можете сделать это.

Примечание: для крыши вы должны пересекать область тени и область крыши.

SGC
источник
Спасибо за добрый совет! Если возможно, удастся оптимизировать этот второй проход, проверяя, какие стены должны быть вычислены с использованием точечного произведения их сегмента по сравнению с теневыми сегментами. Я попробую это и отправлю назад, если это работает.
XPac27
Это было какое-то время, но я, наконец, заставил его работать благодаря вашим предложениям! Мне понадобилось только 2 геометрических метода (один, чтобы узнать, находится ли точка внутри многоугольника, и один, чтобы получить пересечение двух отрезков). Мне все еще нужно обращаться с крышами, но это легко понять. Вы можете посмотреть результат в этом видео и посмотреть исходный код здесь (я просто работал над ним 1 день, чтобы можно было оптимизировать его больше).
XPac27
@ XPac27, это удивительно. Спасибо, что поделился.
ashes999
0

По сути, то, что вы ищете, не может быть сделано. Вы хотите взять кучу 2D-объектов и заставить их отбрасывать тени, как если бы они были 3D-объектами. Если вы хотите иметь полноценные трехмерные тени, вам нужны трехмерные объекты.

DeadMG
источник
1
Но это не 3D отбрасывание теней, как в вопросе. Любая стена полностью блокирует линию обзора в этом направлении, вы не можете иметь объекты переменной высоты.
Юрикс
0

Описанное решение не является полным 3d, так как ему не нужно полное 3d решение. Это будет выглядеть, но это не так. Создание отбрасывания теней должно рассматриваться как пересечение объема. То, что ему нужно, не так сложно. Помните (если у вас есть kown) обреченности и неудачи, такие как рендеринг движка. Все обработки были выполнены в двух измерениях.

SGC
источник
0

Учитывая, что вы хотите, чтобы эта игра была маленькой, можно сказать, что текущая теневая реализация достаточно хороша?

Я признаю, что я не видел этого в действии, то есть я не видел, как будут мешать или не мешать несовершенства теней, когда эти игры будут запущены с динамическими объектами и динамическими источниками света, но, судя по вашим изображениям, я ' Я очень хочу сказать: «Это достаточно хорошо, теперь сосредоточимся на завершении игры». Если текущая реализация оказывается маленькой и выполняется быстро, а исправление того, что вы считаете проблемным, сделает код большим и медленным, я думаю, вам лучше не беспокоиться об этих тенях.

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

IllvilJa
источник