Я думаю написать себе простую 2D-игру. Сначала он не будет блестящим с идеальной графикой или игровым процессом, но я бы посчитал это моим первым шагом в разработке игр для ПК. Итак, представьте себе такую простую 2D-игру на основе спрайтов (например, Heroes IV или Startcraft BroodWar).
Я хочу, чтобы игровой процесс поддерживал день / ночь с соответствующими изменениями освещения, и в то же время было бы безумием создавать спрайты для каждого светового нюанса. Итак, я решил добавить полупрозрачный слой поверх других объектов будет достаточно.
Проблема с этим решением заключается в том, что если в игре есть объект источника света (например, герой, носящий факел или горящее здание), вокруг него должна быть более светлая область, верно? Поскольку я накладываю полупрозрачный слой поверх всего, как бы вы предложили добиться желаемого визуального эффекта факела? Может быть, перерисовать этот слой, добавив «пробелы» или разноцветные области в зависимости от эффекта освещения?
Ответы:
Я не знаю, для чего вы программируете, но вот как я справился с этим в XNA:
List<Light>
объект создается / очищается.Light
объекты добавляются вList<Light>
.RenderTarget2D
.Light
s итерируется и рисуется самостоятельно,RenderTarget2D
используя созданную мной текстуру, которая выглядит следующим образом:(Примечание: я использовал значения R, G и B здесь, но вам, вероятно, следует использовать альфа-канал в вашем актуальная текстура.)
Теперь стоит отметить несколько вещей:
Относительно пункта 4:
На самом деле у меня есть два пользовательских шейдера: один для рисования источников света к цели рендеринга освещения (шаг 4), а другой для рисования цели рендеринга плитки на экране с помощью цели рендеринга освещения (шаг 5).
Шейдер, используемый в точке 4, позволяет мне добавить (то, что я называю) значение «яркости». Это значение
float
умножается на каждый пиксель текстуры, прежде чем оно будет добавлено к цели рендеринга, так что я могу по существу сделать свет ярче или темнее.На этом этапе я также принимаю во внимание значение «масштаба» источника света, что означает, что я могу использовать большие или маленькие источники света, используя только одну текстуру.
Относительно пункта 5:
Представьте, что цель рендеринга освещения по существу имеет значение для каждого пикселя от 0 (черный) до 1 (белый). Шейдер по существу умножает это значение на значения RGB для пикселя в цели рендеринга мозаичного изображения, чтобы получить окончательное нарисованное изображение.
У меня также есть еще немного кода, где я передаю (шейдеру) значение, которое будет использоваться как цвет наложения день / ночь. Это также умножается на значения RGB и включается в расчет цели визуализации освещения.
Теперь, это не позволит вам делать такие вещи, как блокирование света от обхода объектов и так далее, но, по крайней мере, для моих целей, это просто и работает хорошо.
Я написал более подробные сообщения в блоге здесь и здесь, которые могут вам помочь. У меня сейчас нет времени, но если вы хотите, я могу более подробно рассказать здесь о gamedev.
О, и вот посмотрите на это в моем редакторе карт:
источник
Draw
- это то, где вы узнаете, есть ли на плитке огни или нет. Я не перебираю все нарисованные тайлы вUpdate
методе, поэтому я бы добавил дополнительные накладные расходы для этого. Кроме того, XNA пытается гарантировать, чтоUpdate
он будет вызываться 60 раз в секунду, поэтому он может жертвоватьDraw
вызовами для этого, что означает, что этот код будет вызываться реже.Обычно освещение в 2D-играх осуществляется с помощью карты нормалей для всех ваших спрайтов, а затем рассчитывается эффект 3D-освещения для ваших 2D-спрайтов. Это известно как «2.5D». Однако я бы не рекомендовал делать это в вашей первой игре, поскольку она сложная.
Вот потрясающее видео того, кто сделал это в XNA: http://www.youtube.com/watch?v=-Q6ISVaM5Ww
Тем не менее, есть, вероятно, способы обмануть и получить систему псевдо-освещения, которая может работать с различными предположениями.
источник
Трудно предложить подход, если вы не совсем уверены в том, какого эффекта вы пытаетесь достичь. Такие детали, как то, должны ли источники света мешать окружающей среде или нет, какова точка зрения вашей игры, в какой степени свет должен взаимодействовать с окружающей средой и т. Д.
Я оставлю свои два цента, хотя. Посмотрите, подходит ли вам этот урок от Catalin Zima под названием Dynamic 2D Shadows . Как видите, свет имеет радиус и не проходит через препятствия. Вы можете немного оживить радиус и цвет, чтобы он выглядел ближе к реальному свету факела.
В этом случае свет действует как наложение поверх вашей сцены, но не взаимодействует с ним в той же степени, что и в примере с Джоном, хотя и принимает во внимание препятствия.
редактировать
Каталин ссылается на другую статью, которую он использовал в качестве ссылки, но ссылка не работает. Вот обновленная ссылка .
источник