|
С# Средство разработки на платформе .Net |
05.09.2011, 21:30
|
#1
|
Бывалый
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений (для 1,836 пользователей)
|
2D освещение
Доводилось ли кому-нибудь пытаться сделать это?
Передо мной встала задача реализации на XNA:
Ночь (очень слабый синеватый эмбиент), на сцене присутствуют приблизительно от 2 до 20 динамических источников света. Каждый
источник (стандартно) имеет радиус и цвет, тоже изменяющиеся динамически. Они двигаются. Задача теней не стоит, как излишняя
для моей игры.
Сцена - это задник (который не должен освещаться), уровень и ГГ.
Как все это лучше провернуть? С минимальной нагрузкой на центральный и графический процессоры?
Число источников света специально мне ограничивать не хотелось бы, хотя штук двадцать, думаю вполне хватит. Пока они (их параметры) сохранены в List.
Что придумалось:
Так как уровень сохранен в массив, то можно сделать параллельный массив с цветом для каждой ячейки, а его в свою очередь обновлять в каждом вызове Update. Но тогда свет получится "квадратным".
Можно написать шейдер. Я (так как особенно в теме не разбираюсь) полез в интернет и нашел подходящий пример: http://iandreev.wordpress.com/2011/06/30/pointilgh/
Можно его как-то развить до произвольного числа источников?
Может сделать несколько проходов, сменяя параметр, и создав "маску
теней", а потом отрисовав ее поверх сцены?
Третий вариант - сделать вышеупомянутую маску в коде игры, создав новый RenderTarget и, закрасив его в темно синий, натыкать туда текстур источника, разного размера и расцветки.
|
(Offline)
|
|
05.09.2011, 22:51
|
#2
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: 2D освещение
Говоришь 2D? А вид сверху/сбоку? И говоришь что тени не нужны.
При этом погоди, тебе нужно осветить только динамику, или статику тоже?
Дай для наглядности скрин что-ли..
|
(Offline)
|
|
05.09.2011, 23:35
|
#3
|
Бывалый
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений (для 1,836 пользователей)
|
Ответ: 2D освещение
Вид - сбоку. Уровень собран из блоков.
Тени не нужны. Освещение простое - цветовые,
световые пятна. Они могут пересекаться, давая оттенки света. Все окружающее погружено в "эмбиентный полумрак".
Причем сделано (пока; можно переделать) так: один проход (spriteBatch.Begin() --- End()) рисуется задник.
Второй проход зависит от режима (меню/игра). В режиме игры, где освещение собственно и нужно, рисуется поблочно уровень.
Можно представить все это как совокупность "слоев"-текстур.
Текстура - задник, текстура - уровень (обновляется каждый кадр).
Вот последнюю и надо "осветить". Причем большая часть - прозрачна. Там задник "просвечивает".
Что касается скриншотов - пролёт. Игра находится в раскуроченном виде, по причине модернизации функции отрисовки (стандартный Draw()).
Я туда пробовал шейдеры подключить.
Картинка для наглядности:
Последний раз редактировалось FireOwl, 05.09.2011 в 23:52.
Причина: дополнил картинкой
|
(Offline)
|
|
06.09.2011, 13:12
|
#4
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: 2D освещение
если всё нужно настолько примитивно то действительно проще взять одну текстуру белого цвета в виде круго с уменьшающейся альфой в отдалении отценра. и каждому источнику цвета её прикрепять. скейлить и выставлять цвет в зависимости от источника.ну и отрисовывать отдельными проходамм бекграунд, уровень, сточники.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.09.2011, 13:18
|
#5
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: 2D освещение
Я бы сделал как, можно даже с бампом (и это просто).
Рендеришь слой уровня в отдельную текстуру, чтобы вот она была, уже как бы готова для рисования на экран, рисуешь затенённую (цвета амбиента).
Далее, для каждого источника, создаёшь квад размером с источник, и натягиваешь эту текстуру уровня используя screen-space координаты (это можно realtime в шейдере просто очень вычислить), далее рисуешь её, только умножая на цвет источника света, и инвертированную дистанцию. А именно, должно быть в центре 1.0, а ближе к краям 0. Этот квад который рисуешь, рисуй с блендом ADDITIVE (или как там он, ну который засветляет), и будет чики пуки.
Главное учти, что нужно отрисовать уровень либо с альфой, либо делать маску для этого дела.
Таким образом 20 источников будет ваще сказка и просто рисовать, также можно сделать красивый бамп.
UPD:
Вот примеры качества что делал, можно по разному считать дистанцию, и применять математическую градацию, можно и блики сделать, по 10 источников на каждой картинке, на оффисном старом компе, летало.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.09.2011, 19:55
|
#6
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: 2D освещение
Сообщение от MoKa
Я бы сделал как, можно даже с бампом (и это просто).
Рендеришь слой уровня в отдельную текстуру, чтобы вот она была, уже как бы готова для рисования на экран, рисуешь затенённую (цвета амбиента).
Далее, для каждого источника, создаёшь квад размером с источник, и натягиваешь эту текстуру уровня используя screen-space координаты (это можно realtime в шейдере просто очень вычислить), далее рисуешь её, только умножая на цвет источника света, и инвертированную дистанцию. А именно, должно быть в центре 1.0, а ближе к краям 0. Этот квад который рисуешь, рисуй с блендом ADDITIVE (или как там он, ну который засветляет), и будет чики пуки.
Главное учти, что нужно отрисовать уровень либо с альфой, либо делать маску для этого дела.
Таким образом 20 источников будет ваще сказка и просто рисовать, также можно сделать красивый бамп.
UPD:
Вот примеры качества что делал, можно по разному считать дистанцию, и применять математическую градацию, можно и блики сделать, по 10 источников на каждой картинке, на оффисном старом компе, летало.
|
Скрины то с Vertex2d, а это далеко не XNA. если так делать мне кажется на твоём оффисном копе всё будет совсем не "летать"
|
(Offline)
|
|
06.09.2011, 20:38
|
#7
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: 2D освещение
Сообщение от Dream
Скрины то с Vertex2d, а это далеко не XNA. если так делать мне кажется на твоём оффисном копе всё будет совсем не "летать"
|
Вовсе нет, на XNA при корректной реализации также будет шустро и очень даже. Хоть на Xors3D, они все дают достаточный функционал для подобной задачи, и там в основном проседать будет на видяхе, а не на CPU.
|
(Offline)
|
|
06.09.2011, 21:17
|
#8
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: 2D освещение
А может сделать черную текстуру, в местах источников делать её полупрозрачной и рисовать поверх уровня?
Но только там, где уровень непрозрачный.
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
06.09.2011, 21:20
|
#9
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: 2D освещение
И что это будет, чёрные квадраты? Как ты реализуешь перекрещивание источников?
|
(Offline)
|
|
06.09.2011, 21:27
|
#10
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: 2D освещение
чёрную текстуру сделать немного прозрачной, цвет уровня делать под максимальное освещение.
каждый источник света будет увеличивать прозрачность этой текстуры в нужном месте. Увеличивать - не значит делать полностью прозрачной - поэтому эффект от нескольких источников света будет складываться.
Можно менять не только прозрачность, но и добавлять оттенки - получатся разноцветные источники света
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
06.09.2011, 21:54
|
#11
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: 2D освещение
Будет лажа с наложением. Суть света - это влияние на цвет, а не его перекрытие. Для этого можно эту самую текстуру сделать MULTIPLY блендом (a*b). Но снова вопрос: как ты будешь рисовать на эту текстуру кружочки? Можно отдельным проходом, тупо наверх рисовать с ADDITIVE (a+b) блендом, цветные разного размера спрайты. Будет тупо текстура освещения.
Далее нада наложить её Только на пропы и сам уровень, для этого нада либо рисовать все объекты под светом с шейдером который наложит поверх и сблендит текстуру освещения, либо снова делать маску всего уровня и т.п.
Короче говоря, почти те же самые телодвижения что я предлагаю. Только у меня сперва рендер всего, а потом рендер света, также одним проходом - по типу как Deffered Rendering.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:44.
|