Создание системы освещения, как Terraria? - PullRequest
2 голосов
/ 21 ноября 2011

Я пытаюсь сделать свое освещение похожим на освещение от Террарии. Теперь я знаю, как сделать блоки темнее, я могу назначить блоки определенному уровню света, но, как бы я сделал реальный источник света, который излучает свет круглой формы (может быть и в форме ромба)? Буду очень признателен за помощь, также, если я не уясню вопрос, не стесняйтесь спрашивать.

Ответы [ 2 ]

5 голосов
/ 21 ноября 2011

Базовое 2D освещение очень просто. Просто сделайте проверку расстояния от вашего блока до вашего источника света и используйте это значение для масштабирования вашего источника света. Это то, что вы можете сделать довольно просто, так как Spritebatch.Draw имеет хороший параметр Color tint [ссылка]

псевдо-функция может быть

distance =  (block.position - light.position). Length();
lightPower = distance / light.MaxDistance;
finalTint = light.Color * lightPower;
Render Block, with finalTint

Для более приятного на вид света вы можете заменить «расстояние / свет. Максимальное расстояние» более плавным эффектом. Если вы также хотите, чтобы источники света проходили через несколько блоков, таких как Terraria, вы можете сосчитать все блоки между вашим блоком и источником света. Уменьшите свою силу света на эту величину, и вы получите тот же эффект, что и у Terraria.

Конечно, это неоптимизированный способ сделать это, но он должен работать.

Однако последняя версия Terraria, похоже, имеет плавное освещение на пиксель, а не на блок [превью] . Для этого я предполагаю, что они использовали вторую цель рендеринга и / или Pixel Shader, чтобы сохранить высокую производительность. Это может быть немного сложно, если вы не знакомы с рендерингом конвейеров.

Надеюсь, это поможет!

1 голос
/ 21 ноября 2011

Я работаю над игрой с аналогичной моделью освещения, и вот как мы это делаем:

  1. Рисование сцены без освещения к цели рендеринга (называемой 'Буфер сцены')
  2. Нарисуйте источники света сцены, представленные в градиентах серого любой требуемой формы, ко второй цели рендеринга (называемой 'Карта освещения')
  3. Нарисуйте буфер сцены на экране, передав карту света в качестве параметра пиксельному шейдеру
  4. В пиксельном шейдере запросите значение карты освещения для каждого пикселя и при необходимости измените цвет конечного пикселя вверх или вниз.

Это также дает вам возможность иметь цветное освещение; все, что вам нужно сделать, это подкрасить градиенты света, которые вы отображаете на карте освещения. Только не забудьте использовать аддитивное смешивание альфа.

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

...