2D освещение
Доводилось ли кому-нибудь пытаться сделать это?
Передо мной встала задача реализации на XNA: Ночь (очень слабый синеватый эмбиент), на сцене присутствуют приблизительно от 2 до 20 динамических источников света. Каждый источник (стандартно) имеет радиус и цвет, тоже изменяющиеся динамически. Они двигаются. Задача теней не стоит, как излишняя для моей игры. Сцена - это задник (который не должен освещаться), уровень и ГГ. Как все это лучше провернуть? С минимальной нагрузкой на центральный и графический процессоры? Число источников света специально мне ограничивать не хотелось бы, хотя штук двадцать, думаю вполне хватит. Пока они (их параметры) сохранены в List. Что придумалось: Так как уровень сохранен в массив, то можно сделать параллельный массив с цветом для каждой ячейки, а его в свою очередь обновлять в каждом вызове Update. Но тогда свет получится "квадратным". Можно написать шейдер. Я (так как особенно в теме не разбираюсь) полез в интернет и нашел подходящий пример: http://iandreev.wordpress.com/2011/06/30/pointilgh/ Можно его как-то развить до произвольного числа источников? Может сделать несколько проходов, сменяя параметр, и создав "маску теней", а потом отрисовав ее поверх сцены? Третий вариант - сделать вышеупомянутую маску в коде игры, создав новый RenderTarget и, закрасив его в темно синий, натыкать туда текстур источника, разного размера и расцветки. |
Ответ: 2D освещение
Говоришь 2D? А вид сверху/сбоку? И говоришь что тени не нужны.
При этом погоди, тебе нужно осветить только динамику, или статику тоже? Дай для наглядности скрин что-ли.. |
Ответ: 2D освещение
Вложений: 1
Вид - сбоку. Уровень собран из блоков.
Тени не нужны. Освещение простое - цветовые, световые пятна. Они могут пересекаться, давая оттенки света. Все окружающее погружено в "эмбиентный полумрак". Причем сделано (пока; можно переделать) так: один проход (spriteBatch.Begin() --- End()) рисуется задник. Второй проход зависит от режима (меню/игра). В режиме игры, где освещение собственно и нужно, рисуется поблочно уровень. Можно представить все это как совокупность "слоев"-текстур. Текстура - задник, текстура - уровень (обновляется каждый кадр). Вот последнюю и надо "осветить". Причем большая часть - прозрачна. Там задник "просвечивает". Что касается скриншотов - пролёт. Игра находится в раскуроченном виде, по причине модернизации функции отрисовки (стандартный Draw()). Я туда пробовал шейдеры подключить. Картинка для наглядности: |
Ответ: 2D освещение
если всё нужно настолько примитивно то действительно проще взять одну текстуру белого цвета в виде круго с уменьшающейся альфой в отдалении отценра. и каждому источнику цвета её прикрепять. скейлить и выставлять цвет в зависимости от источника.ну и отрисовывать отдельными проходамм бекграунд, уровень, сточники.
|
Ответ: 2D освещение
Я бы сделал как, можно даже с бампом (и это просто).
Рендеришь слой уровня в отдельную текстуру, чтобы вот она была, уже как бы готова для рисования на экран, рисуешь затенённую (цвета амбиента). Далее, для каждого источника, создаёшь квад размером с источник, и натягиваешь эту текстуру уровня используя screen-space координаты (это можно realtime в шейдере просто очень вычислить), далее рисуешь её, только умножая на цвет источника света, и инвертированную дистанцию. А именно, должно быть в центре 1.0, а ближе к краям 0. Этот квад который рисуешь, рисуй с блендом ADDITIVE (или как там он, ну который засветляет), и будет чики пуки. Главное учти, что нужно отрисовать уровень либо с альфой, либо делать маску для этого дела. Таким образом 20 источников будет ваще сказка и просто рисовать, также можно сделать красивый бамп. UPD: Вот примеры качества что делал, можно по разному считать дистанцию, и применять математическую градацию, можно и блики сделать, по 10 источников на каждой картинке, на оффисном старом компе, летало. |
Ответ: 2D освещение
Цитата:
|
Ответ: 2D освещение
Цитата:
|
Ответ: 2D освещение
А может сделать черную текстуру, в местах источников делать её полупрозрачной и рисовать поверх уровня?
Но только там, где уровень непрозрачный. |
Ответ: 2D освещение
И что это будет, чёрные квадраты? Как ты реализуешь перекрещивание источников?
|
Ответ: 2D освещение
чёрную текстуру сделать немного прозрачной, цвет уровня делать под максимальное освещение.
каждый источник света будет увеличивать прозрачность этой текстуры в нужном месте. Увеличивать - не значит делать полностью прозрачной - поэтому эффект от нескольких источников света будет складываться. Можно менять не только прозрачность, но и добавлять оттенки - получатся разноцветные источники света |
Ответ: 2D освещение
Будет лажа с наложением. Суть света - это влияние на цвет, а не его перекрытие. Для этого можно эту самую текстуру сделать MULTIPLY блендом (a*b). Но снова вопрос: как ты будешь рисовать на эту текстуру кружочки? Можно отдельным проходом, тупо наверх рисовать с ADDITIVE (a+b) блендом, цветные разного размера спрайты. Будет тупо текстура освещения.
Далее нада наложить её Только на пропы и сам уровень, для этого нада либо рисовать все объекты под светом с шейдером который наложит поверх и сблендит текстуру освещения, либо снова делать маску всего уровня и т.п. Короче говоря, почти те же самые телодвижения что я предлагаю. Только у меня сперва рендер всего, а потом рендер света, также одним проходом - по типу как Deffered Rendering. |
Часовой пояс GMT +4, время: 20:34. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot