![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое освещение в 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-д какой-нибудь светящийся шарик летает, лучше всего вообще градиент света в фотошопе сделай и рисуй с альфа-каналом, дешевле будет, чем считать как выше описано