forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   2D освещение (http://forum.boolean.name/showthread.php?t=15430)

FireOwl 05.09.2011 21:30

2D освещение
 
Доводилось ли кому-нибудь пытаться сделать это?

Передо мной встала задача реализации на XNA:
Ночь (очень слабый синеватый эмбиент), на сцене присутствуют приблизительно от 2 до 20 динамических источников света. Каждый
источник (стандартно) имеет радиус и цвет, тоже изменяющиеся динамически. Они двигаются. Задача теней не стоит, как излишняя
для моей игры.
Сцена - это задник (который не должен освещаться), уровень и ГГ.

Как все это лучше провернуть? С минимальной нагрузкой на центральный и графический процессоры?

Число источников света специально мне ограничивать не хотелось бы, хотя штук двадцать, думаю вполне хватит. Пока они (их параметры) сохранены в List.

Что придумалось:
Так как уровень сохранен в массив, то можно сделать параллельный массив с цветом для каждой ячейки, а его в свою очередь обновлять в каждом вызове Update. Но тогда свет получится "квадратным".

Можно написать шейдер. Я (так как особенно в теме не разбираюсь) полез в интернет и нашел подходящий пример: http://iandreev.wordpress.com/2011/06/30/pointilgh/
Можно его как-то развить до произвольного числа источников?

Может сделать несколько проходов, сменяя параметр, и создав "маску
теней", а потом отрисовав ее поверх сцены?

Третий вариант - сделать вышеупомянутую маску в коде игры, создав новый RenderTarget и, закрасив его в темно синий, натыкать туда текстур источника, разного размера и расцветки.

moka 05.09.2011 22:51

Ответ: 2D освещение
 
Говоришь 2D? А вид сверху/сбоку? И говоришь что тени не нужны.
При этом погоди, тебе нужно осветить только динамику, или статику тоже?

Дай для наглядности скрин что-ли..

FireOwl 05.09.2011 23:35

Ответ: 2D освещение
 
Вложений: 1
Вид - сбоку. Уровень собран из блоков.
Тени не нужны. Освещение простое - цветовые,
световые пятна. Они могут пересекаться, давая оттенки света. Все окружающее погружено в "эмбиентный полумрак".

Причем сделано (пока; можно переделать) так: один проход (spriteBatch.Begin() --- End()) рисуется задник.
Второй проход зависит от режима (меню/игра). В режиме игры, где освещение собственно и нужно, рисуется поблочно уровень.

Можно представить все это как совокупность "слоев"-текстур.
Текстура - задник, текстура - уровень (обновляется каждый кадр).
Вот последнюю и надо "осветить". Причем большая часть - прозрачна. Там задник "просвечивает".

Что касается скриншотов - пролёт. Игра находится в раскуроченном виде, по причине модернизации функции отрисовки (стандартный Draw()).
Я туда пробовал шейдеры подключить.

Картинка для наглядности:

Dream 06.09.2011 13:12

Ответ: 2D освещение
 
если всё нужно настолько примитивно то действительно проще взять одну текстуру белого цвета в виде круго с уменьшающейся альфой в отдалении отценра. и каждому источнику цвета её прикрепять. скейлить и выставлять цвет в зависимости от источника.ну и отрисовывать отдельными проходамм бекграунд, уровень, сточники.

moka 06.09.2011 13:18

Ответ: 2D освещение
 
Я бы сделал как, можно даже с бампом (и это просто).

Рендеришь слой уровня в отдельную текстуру, чтобы вот она была, уже как бы готова для рисования на экран, рисуешь затенённую (цвета амбиента).

Далее, для каждого источника, создаёшь квад размером с источник, и натягиваешь эту текстуру уровня используя screen-space координаты (это можно realtime в шейдере просто очень вычислить), далее рисуешь её, только умножая на цвет источника света, и инвертированную дистанцию. А именно, должно быть в центре 1.0, а ближе к краям 0. Этот квад который рисуешь, рисуй с блендом ADDITIVE (или как там он, ну который засветляет), и будет чики пуки.
Главное учти, что нужно отрисовать уровень либо с альфой, либо делать маску для этого дела.

Таким образом 20 источников будет ваще сказка и просто рисовать, также можно сделать красивый бамп.

UPD:
Вот примеры качества что делал, можно по разному считать дистанцию, и применять математическую градацию, можно и блики сделать, по 10 источников на каждой картинке, на оффисном старом компе, летало.





Dream 06.09.2011 19:55

Ответ: 2D освещение
 
Цитата:

Сообщение от MoKa (Сообщение 201441)
Я бы сделал как, можно даже с бампом (и это просто).

Рендеришь слой уровня в отдельную текстуру, чтобы вот она была, уже как бы готова для рисования на экран, рисуешь затенённую (цвета амбиента).

Далее, для каждого источника, создаёшь квад размером с источник, и натягиваешь эту текстуру уровня используя screen-space координаты (это можно realtime в шейдере просто очень вычислить), далее рисуешь её, только умножая на цвет источника света, и инвертированную дистанцию. А именно, должно быть в центре 1.0, а ближе к краям 0. Этот квад который рисуешь, рисуй с блендом ADDITIVE (или как там он, ну который засветляет), и будет чики пуки.
Главное учти, что нужно отрисовать уровень либо с альфой, либо делать маску для этого дела.

Таким образом 20 источников будет ваще сказка и просто рисовать, также можно сделать красивый бамп.

UPD:
Вот примеры качества что делал, можно по разному считать дистанцию, и применять математическую градацию, можно и блики сделать, по 10 источников на каждой картинке, на оффисном старом компе, летало.





Скрины то с Vertex2d, а это далеко не XNA. если так делать мне кажется на твоём оффисном копе всё будет совсем не "летать"

moka 06.09.2011 20:38

Ответ: 2D освещение
 
Цитата:

Сообщение от Dream (Сообщение 201475)
Скрины то с Vertex2d, а это далеко не XNA. если так делать мне кажется на твоём оффисном копе всё будет совсем не "летать"

Вовсе нет, на XNA при корректной реализации также будет шустро и очень даже. Хоть на Xors3D, они все дают достаточный функционал для подобной задачи, и там в основном проседать будет на видяхе, а не на CPU.

Igor 06.09.2011 21:17

Ответ: 2D освещение
 
А может сделать черную текстуру, в местах источников делать её полупрозрачной и рисовать поверх уровня?
Но только там, где уровень непрозрачный.

moka 06.09.2011 21:20

Ответ: 2D освещение
 
И что это будет, чёрные квадраты? Как ты реализуешь перекрещивание источников?

Igor 06.09.2011 21:27

Ответ: 2D освещение
 
чёрную текстуру сделать немного прозрачной, цвет уровня делать под максимальное освещение.
каждый источник света будет увеличивать прозрачность этой текстуры в нужном месте. Увеличивать - не значит делать полностью прозрачной - поэтому эффект от нескольких источников света будет складываться.
Можно менять не только прозрачность, но и добавлять оттенки - получатся разноцветные источники света

moka 06.09.2011 21:54

Ответ: 2D освещение
 
Будет лажа с наложением. Суть света - это влияние на цвет, а не его перекрытие. Для этого можно эту самую текстуру сделать MULTIPLY блендом (a*b). Но снова вопрос: как ты будешь рисовать на эту текстуру кружочки? Можно отдельным проходом, тупо наверх рисовать с ADDITIVE (a+b) блендом, цветные разного размера спрайты. Будет тупо текстура освещения.
Далее нада наложить её Только на пропы и сам уровень, для этого нада либо рисовать все объекты под светом с шейдером который наложит поверх и сблендит текстуру освещения, либо снова делать маску всего уровня и т.п.

Короче говоря, почти те же самые телодвижения что я предлагаю. Только у меня сперва рендер всего, а потом рендер света, также одним проходом - по типу как Deffered Rendering.


Часовой пояс GMT +4, время: 21:45.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot