Я не знаю, для чого ви програмуєте, але ось як я обробляв це в XNA:
- Під час виклику малювання
List<Light>
об'єкт створюється / очищається.
- Під час циклу малювання плитки кожну плитку перевіряють, чи немає у неї пов'язаних вогнів. Якщо це так,
Light
об'єкти додаються до List<Light>
.
- Плитку малюють самостійно
RenderTarget2D
.
- Після циклу плитки список
Light
s переглядається і складається самостійно, RenderTarget2D
використовуючи текстуру, яку я створив так:
(Примітка: тут я використовував значення R, G і B, але, ймовірно, ви повинні використовувати альфа-канал у своєму фактична текстура.)
- Використовуючи користувальницький шейдер, я повертаю поверхню плитки до екрану і передаю в освітлювальну поверхню як параметр, який отримує вибірку для значення "темряви" на кожному пікселі.
Тепер слід зазначити кілька речей:
Щодо пункту 4:
Насправді у мене є два користувальницькі шейдери, один для малювання вогнів до цілі відображення освітлення (крок 4) та інший для малювання цілі візуалізації плитки на екран за допомогою цілі візуалізації освітлення (крок 5).
Шейдер, що використовується в точці 4, дозволяє мені додати (те, що я називаю) значення "світності". Це значення - це float
коефіцієнт, що множиться на кожен піксель текстури, перш ніж він буде доданий до цілі візуалізації, щоб я міг зробити світло яскравішим або темнішим.
На цьому етапі я також враховую значення "масштабу" світла, що означає, що я можу мати великі або маленькі вогні, використовуючи лише одну текстуру.
Щодо пункту 5:
Подумайте, що ціль відображення освітлення є як такою, що має значення для кожного пікселя від 0 (чорний) до 1 (білий). Шейдер, по суті, множує це значення на RGB-значення для пікселя в цілі відображення плитки, щоб зробити остаточне намальоване зображення.
У мене також є ще якийсь код, де я передаю (у шейдер) значення, яке використовуватиметься як колір накладення день / ніч. Це також множиться на значення RGB і включається в розрахунки цільового освітлення.
Тепер це не дозволить вам робити такі речі, як блокове світло від обходу предметів і чогось іншого, але, принаймні для моїх цілей, це просто і працює добре.
Я писав більш детальні публікації в блогах тут і тут, які можуть вам допомогти. Зараз у мене немає часу, але якщо ви хочете, я можу детальніше розібратися тут, на gamedev.
О, і ось дивіться на це в моєму редакторі карт: