Я пишу небольшой двухмерный изометрический движок на C ++ и пытаюсь реализовать отбрасывание теней в реальном времени. Я следовал простому подходу, описанному на этой странице, и вот результат (свет расположен в том же положении, что и желтый куб):
Результат очень хороший, но на стенах и кубиках отсутствуют тени. Вот пример того, как это должно выглядеть (я нарисовал ожидаемые тени зеленым цветом):
Все нарисованные кубы просто состоят из 3-х четырехугольников, расположенных в позиции XY и с глубиной Z (z = x + y). Я использую OpenGL с орфографической матрицей (glOrtho). Тени рисуются с помощью буфера трафарета.
Я ищу ресурсы или решения, которые помогли бы мне завершить эту реализацию отбрасывания теней.
Большое спасибо!
Ответы:
Для крыши и стен вы можете попытаться определить пересечения между вашими сегментами стены и сгенерированными областями теней. Вам нужно два прохода рендеринга ваших теней. Первый будет делать то, что вы делаете сегодня (в памяти). Второй проход рассчитает пересечения крыши и стены. Последний этап - реальный рендеринг. DeadMG не прав, вы можете сделать это.
Примечание: для крыши вы должны пересекать область тени и область крыши.
источник
По сути, то, что вы ищете, не может быть сделано. Вы хотите взять кучу 2D-объектов и заставить их отбрасывать тени, как если бы они были 3D-объектами. Если вы хотите иметь полноценные трехмерные тени, вам нужны трехмерные объекты.
источник
Описанное решение не является полным 3d, так как ему не нужно полное 3d решение. Это будет выглядеть, но это не так. Создание отбрасывания теней должно рассматриваться как пересечение объема. То, что ему нужно, не так сложно. Помните (если у вас есть kown) обреченности и неудачи, такие как рендеринг движка. Все обработки были выполнены в двух измерениях.
источник
Учитывая, что вы хотите, чтобы эта игра была маленькой, можно сказать, что текущая теневая реализация достаточно хороша?
Я признаю, что я не видел этого в действии, то есть я не видел, как будут мешать или не мешать несовершенства теней, когда эти игры будут запущены с динамическими объектами и динамическими источниками света, но, судя по вашим изображениям, я ' Я очень хочу сказать: «Это достаточно хорошо, теперь сосредоточимся на завершении игры». Если текущая реализация оказывается маленькой и выполняется быстро, а исправление того, что вы считаете проблемным, сделает код большим и медленным, я думаю, вам лучше не беспокоиться об этих тенях.
Я знаю, я знаю, предлагать «не пытайтесь решить проблему», поскольку решение проблемы может быть плохой практикой. Тем не менее, я честно хочу сказать, что это действительно хорошо, как и если вы хотите небольшой след для своего кода.
источник