Я не знаю, для чего вы программируете, но вот как я справился с этим в XNA:
- При вызове отрисовки
List<Light>
объект создается / очищается.
- Во время цикла прорисовки плитки каждая плитка проверяется, чтобы увидеть, имеет ли она какие-либо источники света, связанные с ней. Если это так,
Light
объекты добавляются в List<Light>
.
- Плитка рисуется самостоятельно
RenderTarget2D
.
- После цикла мозаики список
Light
s итерируется и рисуется самостоятельно, RenderTarget2D
используя созданную мной текстуру, которая выглядит следующим образом:
(Примечание: я использовал значения R, G и B здесь, но вам, вероятно, следует использовать альфа-канал в вашем актуальная текстура.)
- Используя пользовательский шейдер, я рендерирую поверхность плитки на экран и передаю ее в качестве параметра, который выбирается для значения «темноты» в каждом пикселе.
Теперь стоит отметить несколько вещей:
Относительно пункта 4:
На самом деле у меня есть два пользовательских шейдера: один для рисования источников света к цели рендеринга освещения (шаг 4), а другой для рисования цели рендеринга плитки на экране с помощью цели рендеринга освещения (шаг 5).
Шейдер, используемый в точке 4, позволяет мне добавить (то, что я называю) значение «яркости». Это значение float
умножается на каждый пиксель текстуры, прежде чем оно будет добавлено к цели рендеринга, так что я могу по существу сделать свет ярче или темнее.
На этом этапе я также принимаю во внимание значение «масштаба» источника света, что означает, что я могу использовать большие или маленькие источники света, используя только одну текстуру.
Относительно пункта 5:
Представьте, что цель рендеринга освещения по существу имеет значение для каждого пикселя от 0 (черный) до 1 (белый). Шейдер по существу умножает это значение на значения RGB для пикселя в цели рендеринга мозаичного изображения, чтобы получить окончательное нарисованное изображение.
У меня также есть еще немного кода, где я передаю (шейдеру) значение, которое будет использоваться как цвет наложения день / ночь. Это также умножается на значения RGB и включается в расчет цели визуализации освещения.
Теперь, это не позволит вам делать такие вещи, как блокирование света от обхода объектов и так далее, но, по крайней мере, для моих целей, это просто и работает хорошо.
Я написал более подробные сообщения в блоге здесь и здесь, которые могут вам помочь. У меня сейчас нет времени, но если вы хотите, я могу более подробно рассказать здесь о gamedev.
О, и вот посмотрите на это в моем редакторе карт: