Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > С#

С# Средство разработки на платформе .Net

Ответ
 
Опции темы
Старый 05.09.2011, 21:30   #1
FireOwl
Бывалый
 
Аватар для FireOwl
 
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений
(для 1,836 пользователей)
2D освещение

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

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

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

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

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

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

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

Третий вариант - сделать вышеупомянутую маску в коде игры, создав новый RenderTarget и, закрасив его в темно синий, натыкать туда текстур источника, разного размера и расцветки.
__________________
N"Gasta! Kvata! Kvakis!
Ahkstas so novajxletero (oix jhemile) so Ranetauw.
(Offline)
 
Ответить с цитированием
Старый 05.09.2011, 22:51   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: 2D освещение

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

Дай для наглядности скрин что-ли..
(Offline)
 
Ответить с цитированием
Старый 05.09.2011, 23:35   #3
FireOwl
Бывалый
 
Аватар для FireOwl
 
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений
(для 1,836 пользователей)
Ответ: 2D освещение

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

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

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

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

Картинка для наглядности:
Миниатюры
Нажмите на изображение для увеличения
Название: level.png
Просмотров: 1272
Размер:	29.1 Кб
ID:	14742  
__________________
N"Gasta! Kvata! Kvakis!
Ahkstas so novajxletero (oix jhemile) so Ranetauw.

Последний раз редактировалось FireOwl, 05.09.2011 в 23:52. Причина: дополнил картинкой
(Offline)
 
Ответить с цитированием
Старый 06.09.2011, 13:12   #4
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: 2D освещение

если всё нужно настолько примитивно то действительно проще взять одну текстуру белого цвета в виде круго с уменьшающейся альфой в отдалении отценра. и каждому источнику цвета её прикрепять. скейлить и выставлять цвет в зависимости от источника.ну и отрисовывать отдельными проходамм бекграунд, уровень, сточники.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
FireOwl (06.09.2011)
Старый 06.09.2011, 13:18   #5
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: 2D освещение

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

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

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

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

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




(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
FireOwl (06.09.2011)
Старый 06.09.2011, 19:55   #6
Dream
быдло
 
Регистрация: 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
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: 2D освещение

Сообщение от Dream Посмотреть сообщение
Скрины то с Vertex2d, а это далеко не XNA. если так делать мне кажется на твоём оффисном копе всё будет совсем не "летать"
Вовсе нет, на XNA при корректной реализации также будет шустро и очень даже. Хоть на Xors3D, они все дают достаточный функционал для подобной задачи, и там в основном проседать будет на видяхе, а не на CPU.
(Offline)
 
Ответить с цитированием
Старый 06.09.2011, 21:17   #8
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
Ответ: 2D освещение

А может сделать черную текстуру, в местах источников делать её полупрозрачной и рисовать поверх уровня?
Но только там, где уровень непрозрачный.
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Старый 06.09.2011, 21:20   #9
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: 2D освещение

И что это будет, чёрные квадраты? Как ты реализуешь перекрещивание источников?
(Offline)
 
Ответить с цитированием
Старый 06.09.2011, 21:27   #10
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
Ответ: 2D освещение

чёрную текстуру сделать немного прозрачной, цвет уровня делать под максимальное освещение.
каждый источник света будет увеличивать прозрачность этой текстуры в нужном месте. Увеличивать - не значит делать полностью прозрачной - поэтому эффект от нескольких источников света будет складываться.
Можно менять не только прозрачность, но и добавлять оттенки - получатся разноцветные источники света
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Старый 06.09.2011, 21:54   #11
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: 2D освещение

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

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com