Свет и тень для тайлового движка.

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

Ответить
Аватара пользователя
Oreyn
Сообщения: 297
Зарегистрирован: 07 авг 2013, 14:59

Свет и тень для тайлового движка.

Сообщение Oreyn » 07 авг 2013, 16:16

Собираю тайловый движок на SDL и решил прикрутить прорисовку тайлов с разным уровнем освещения.
Блитю еще один слой с черными квадратами и разным уровнем прозрачности через альфаблендинг.

И вот что выходит:
Скрытый текст: ПОКАЗАТЬ
Изображение

Изображение
Теперь думаю, как сделать этот переход плавнее? Чтобы освещенность менялась в пределах тайла. Минус еще в том, что такая квадратная освещенность напоминает об общей квадратности карты, которую пытается скрыть правильно нарисованный тайлсет.
Напрашивается рисование хитрых масок на дополнительном слое. Как это правильно делают в других играх?

Аватара пользователя
Максим Кич
Администратор
Сообщения: 1642
Зарегистрирован: 03 дек 2006, 20:17
Откуда: Витебск, Беларусь
Контактная информация:

Re: Свет и тень для тайлового движка.

Сообщение Максим Кич » 07 авг 2013, 16:46

Вариантов множество. Можно делать неровные переходы (теми же сложными масками), можно задавать цвет по вертексам… но лично мне кажется, что если нужно скрыть тайловость, то и освещённость надо считать на непрерывном пространстве.

UPD: Интересная отрисовка стен. Можно скриншот с более сложными ситуациями, чем одна комната? Или таких просто не предполагается?
Dump the screen? [y/n]

Аватара пользователя
Oreyn
Сообщения: 297
Зарегистрирован: 07 авг 2013, 14:59

Re: Свет и тень для тайлового движка.

Сообщение Oreyn » 07 авг 2013, 18:37

Вертексы пока слишком сложно для меня, слишком много нужно чехлов снимать. Возможно все-таки фигурные полукруглые маски и резкий переход с 2 или 3 градациями будет в самый раз.

Для пробы нарисовал черно-прозрачную маску градиентом в фотошопе и блитнул её слоем. Вышло примерно то, что нужно. Но теперь с нуля придумывать механизм программной попиксельной прорисовки этой маски в зависимости от источников света, их интенсивности и наличия преград, чувствую этот велосипед называется вертекс.

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

Аватара пользователя
Максим Кич
Администратор
Сообщения: 1642
Зарегистрирован: 03 дек 2006, 20:17
Откуда: Витебск, Беларусь
Контактная информация:

Re: Свет и тень для тайлового движка.

Сообщение Максим Кич » 07 авг 2013, 22:16

А нет ли для SDL чего-нибудь вроде LightEngine2d из ZenGL? Выстроить векторную геометрию по тайлам — элементарнейшая задача, а времени и сил сэкономить удастся массу.
Dump the screen? [y/n]

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: Свет и тень для тайлового движка.

Сообщение Cfyz » 07 авг 2013, 22:45

Oreyn писал(а):Вертексы пока слишком сложно для меня, слишком много нужно чехлов снимать.
Зря, это проще, чем кажется. По крайней мере не настолько, чтоб с этим нельзя было в общих чертах разобраться за вечер-два, но в долгой перспективе сэкономит кучу сил. В самом-самом кратце: Как рисовать 2D графику в OpenGL. Что, ты, возможно, уже знаешь, потому как следующая фраза несколько сбивает с толку:
Oreyn писал(а):Но теперь с нуля придумывать механизм программной попиксельной прорисовки этой маски в зависимости от источников света, их интенсивности и наличия преград, чувствую этот велосипед называется вертекс.
Попиксельная прорисовка в зависимости от преград? Разве недостаточно просто сделать плавный переход цвета-затемнения так, чтобы не было видно ступенек яркости на границах тайлов? Просто если все интереснее и ты собираешься делать честный попиксельный рассчет, то это совсем другой разговор и вершины тайлов там далеко не самое страшное.
Пытается раскуклиться

Аватара пользователя
Oreyn
Сообщения: 297
Зарегистрирован: 07 авг 2013, 14:59

Re: Свет и тень для тайлового движка.

Сообщение Oreyn » 08 авг 2013, 06:34

Максим Кич писал(а):А нет ли для SDL чего-нибудь вроде LightEngine2d из ZenGL? Выстроить векторную геометрию по тайлам — элементарнейшая задача, а времени и сил сэкономить удастся массу.
Увы, своего в SDL не планируется, они позиционируют как низкоуровневую прослойку для доступа к видеобуферу, уже на основе которой можно строить свои лайт 2д энжины.
Cfyz писал(а):Попиксельная прорисовка в зависимости от преград? Разве недостаточно просто сделать плавный переход цвета-затемнения так, чтобы не было видно ступенек яркости на границах тайлов? Просто если все интереснее и ты собираешься делать честный попиксельный рассчет, то это совсем другой разговор и вершины тайлов там далеко не самое страшное.
Аппетит приходит во время еды. Из вопроса "как сделать плавное затемнение/освещение между тайлами?" (Нарисовать и наложить маску) всплывает - "какие тайлы и в каком направлении должны быть затемнены/освещены?". И тут появляются и источники света, их интенсивность, направленность (луч фонарика или круговой точечный светильник), преграды и их огибание.
И чем больше думаю над этим, тем больше кажется, что это задача не тайлового движка, а отдельного движка расчета света. Которому на вход подаем свойства источников света и монохромную карту преград (дискретные непроходимые тайлы превращаем в квадраты). А он выдает световую маску, которую уже тайловый движок применит в виде слоя. И отделить этот движок расчета света через абстрактный интерфейс.

Но и придумывать алгоритм расчета освещенности с нуля и бороздить пузом все подводные камни совсем не хочется. Получается или подыскать готовый или действительно заняться изучением непаханой нивы OpenGL. Вот кстати пример реализации света в 2д через OpenGL https://www.youtube.com/watch?v=fsbECSpwtig

Аватара пользователя
Максим Кич
Администратор
Сообщения: 1642
Зарегистрирован: 03 дек 2006, 20:17
Откуда: Витебск, Беларусь
Контактная информация:

Re: Свет и тень для тайлового движка.

Сообщение Максим Кич » 08 авг 2013, 09:16

http://www.dannybirch.com/simple-2d-lighting-system/

Гугль выдал вот такую штуку. Не конечное решение, но для затравки может подойти.

Если нужна помощь с переводом — стучись, постараюсь чем-нибудь помочь.
Dump the screen? [y/n]

Аватара пользователя
Jesus05
Сообщения: 1840
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: Свет и тень для тайлового движка.

Сообщение Jesus05 » 08 авг 2013, 09:47

Максим Кич писал(а):http://www.dannybirch.com/simple-2d-lighting-system/

Гугль выдал вот такую штуку. Не конечное решение, но для затравки может подойти.

Если нужна помощь с переводом — стучись, постараюсь чем-нибудь помочь.
Там буков почти нет :) сплошной код...
Спасибо за ссылку поизучаю хотя SDL-лом и не пользуюсь.

Аватара пользователя
watabou
Сообщения: 224
Зарегистрирован: 29 ноя 2012, 09:59
Контактная информация:

Re: Свет и тень для тайлового движка.

Сообщение watabou » 08 авг 2013, 10:04

Oreyn писал(а):...Теперь думаю, как сделать этот переход плавнее? Чтобы освещенность менялась в пределах тайла. Минус еще в том, что такая квадратная освещенность напоминает об общей квадратности карты, которую пытается скрыть правильно нарисованный тайлсет.
Напрашивается рисование хитрых масок на дополнительном слое. Как это правильно делают в других играх?
Я у себя всё затемнение рисую в одной текстуре (1 пиксель - 1 тайл) и отрисовываю эту текстуру с интерполяцией (и с увеличением, естественно), получаются сглаженные переходы между тайлами. У меня, правда, там не освещение, а просто поле зрения/туман войны, но принцип тот же.
Пример:
Изображение

Аватара пользователя
Oreyn
Сообщения: 297
Зарегистрирован: 07 авг 2013, 14:59

Re: Свет и тень для тайлового движка.

Сообщение Oreyn » 08 авг 2013, 14:55

Максим Кич писал(а):http://www.dannybirch.com/simple-2d-lighting-system/

Гугль выдал вот такую штуку. Не конечное решение, но для затравки может подойти.

Если нужна помощь с переводом — стучись, постараюсь чем-нибудь помочь.
Хорошая затравка, за ссылку спасибо.
Общая идея, насколько я понял в примере, следующая - вокруг источника света на 360 с шагом в 1 градус с помощью OpenGL рисуют секторные конусы "лучи", у которых альфа цвета плавно гаснет к кончикам. Таким образом уходит проблема муара, если бы вместо конусов лучами были простые линии. Каждому лучу проверяют математически пересечение с любой линией препятствий и укорачивают луч при необходимости.
watabou писал(а): Я у себя всё затемнение рисую в одной текстуре (1 пиксель - 1 тайл) и отрисовываю эту текстуру с интерполяцией (и с увеличением, естественно), получаются сглаженные переходы между тайлами.
Хорошая лаконичная реализация, взял на заметку.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 24 гостя