Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамическое освещение в 2Д [Delphi, OpenGL, Windows]


П7 ©   (2005-04-08 14:51:00) 

Мастера! Объясните мне суть реализации сего чуда на OpenGL? Особенно этот вопрос хотелось бы адресоват XPoroger'у, который его уже реализовывал в своей игре, и Darthman'у, который на форуме GameDev.ru говорил что это легко! (:
А то я чего-то не догоняю, как бы это так хитро реализовать...


Zer0[np]   (2005-04-09 01:04:00) [1]

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


Zer0[np]   (2005-04-09 01:01:00) [2]

хех. есть подозрение что в гише тени стенсильные.


П7   (2005-04-09 00:53:00) [3]

Не, какой нах стенсил? (: всё плоское, что моя справка из психушки (:
Лады, спосибо за консультацию.
Тема временно закрыта. (:


XProger   (2005-04-09 00:32:00) [4]

Хочешь сделать Дум3 в 2д? Юзай стенсил, но при этом будь готов к письмам "Вон у меня GF2 и твоя %$#@ на ней свыше 5 фпс не показывает" :)

Хотя, если ухудшить качество лайтмэпа то можно будет генерировать его в реальном времени... :)


П7   (2005-04-09 00:22:00) [5]

Хым. Ясно. Я, кстати, только сейчас заметил, что я твой ник не правильно написал, извини, если что. (:
Блендинг, лайт-мепы, не то, а жаль, ладно, будем делать через одно место... (:


XProger   (2005-04-08 22:01:00) [6]

Хм... :)
Если ты имел ввиду TFK то там нет динамических теней (и не будет).
А те тени что есть расчитываются перед первым запуском карты в игре и сохраняются в неё же. Зовётся это Lightmap'ом.
А расчитывается довольно просто и качественно, но достаточно долго для реалтайм :)

А вот свет от ракет и прочей бяки, делал обычным цветастым спрайтом с ч/б текстурой, перед выводом которого включал блендинг и использовал glBlendFunc(GL_SRC_ALPHA, GL_ONE) (умножение)

Но вот тени (лайтмэп) накладывал после отрисовки всей сцены, но немного другим умножением glBlendFunc(GL_ZERO, GL_SRC_COLOR); (1 - С)

От динамических теней отказался из-за их тормознутости... :)


П7   (2005-04-08 21:22:00) [7]

Мутно пишете, товарищЪ... (: При чём тут релизация? Если всё дело в "ручной геометрии", тогда проблем нет, но если есть иные способы, то о них мне и хотелось бы узнать.


A22   (2005-04-08 17:24:00) [8]

тогда вопрос бы иначе обозвал, освещение освещением, а тени - совсем другой вопрос..

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


П7   (2005-04-08 16:22:00) [9]

Как пример могу ещё привести GISH (так вроде пишется). Там есть уровень, где на цепи болтается фонарик, а он блоков пляшут тени. Простенькие, без наворотов, но смотреть приятно... (:


П7   (2005-04-08 16:14:00) [10]

Это я все понимаю. Но динамическое освещение предполагает наличие динамических теней... (: Вот это-то мне и нужно.


A22   (2005-04-08 15:44:00) [11]

спрайт выводится на кран как прямоугольник (состоящий из 2 треугольников) с натянутой текстурой, так? так. у вершин прямоугольника кроме текстурных координат есть еще такой параметр как цвет. с этим цветом разные вещи вытворять можно, но для освещения нужно вссего лишь указать api, что результирующий цвет пикселя на экране = цвет текстуры * цвет вершины полигона. далее (возьмем простой случай) для point лампочки, стоящей в позиции light_pos, с заданным радиусом освещения radius и мощностью power считаешь силу света в конкретной точке p:
light_power = power *(1 - VectorLength(p - light_pos) / radius);
для усорения расчетов можно заранее посчитать power/radius, назвать это чудо coeff и переписать формулу как
light_power = power - VectorLength(p - light_pos) * coeff;
кстати, если VectorLength > radius, light_power сразу = 0

теперь для создания освещения цвет вершины устанавливаешь как
LightColor * light_power (LightColor - трехкомпонентный вектор);
если лампочек много - считаешь для каждой и интерполируешь значение (берешь среднее арифметическое).

наверное, все. для 2-д хватит с головой, не переусердствуй с лампочками...

P.S. если у тебя в 2-д какой-нибудь светящийся шарик летает, лучше всего вообще градиент света в фотошопе сделай и рисуй с альфа-каналом, дешевле будет, чем считать как выше описано


Наверх

Титульная страница Поиск, карта сайта Написать письмо