Ура, я решил баг с этими черными полосами. Сделал как вы посоветовали и стал еще использовать чуть больше лайтмап (256х256).
Такой размер лайтов хоть нормальный? И еще, можете подсказать, пожалуйста, каким образом можно наложить лайтмап на динамический объект.
Скриншот работы:
zombihello
> каким образом можно наложить лайтмап на динамический объект.
Если лайтмэп в 3D текстуре, то он ложится и на динамические объекты, вот отбрасывать тень сами динамические объекты таким образом не могут.
Mikle
> вот отбрасывать тень сами динамические объекты таким образом не могут
Ну, то что динамика таким образом тень не будет отбрасывать, то ясно и с этим можно смириться (думаю Shadow Maps здесь может выручить).
> Если лайтмэп в 3D текстуре
А можно подробнее как лайтмэп в 3D текстуру запихнуть, сам алгоритм, ибо я что-то не могу представить это.
На данный момент у меня карта освещения хранится в 2D текстуре (для каждого полигона)
zombihello
Я ещё на первой странице этой темы давал ссылку на рабочий пример.
Смысл - полностью "погрузить" уровень в 3D текстуру, тогда текстурные координаты для лайтмэпа рассчитывать не надо, не надо делать атлас, одна текстура для всей карты. Выборка из 3D текстуры берётся по обычным координатам.
Рассчитывается она так же, как и для 2D, только рассчитываем освещённость не для поверхностей, а для всего объёма.
Я понял, спасибо за объяснение, буду пытаться как-то в своем компиляторе лайтмапов это сделать.
А точнее, сделать просчет нужного размера 3D текстуры, ее просчет и сохранение в файл
(как я понимаю это "блин" из 2D текстур и чтобы сохранить объемную текстуру
надо сохранить каждый такой слой? Исправьте, если ошибаюсь, ибо с 3D текстурами ни разу не работал,
а в интернете инфы как кот наплакал).
По поводу определения размера. Я правильно понял, что размер 3D текстуры = размер карты и
исходя из этого вычислить размер можно найдя минимальный и максимальный x, y, z на уровне?
(т.е abs(Xmin) + abs(Xmax) = SizeX и так по всем координатам, я правильно думаю?)
zombihello
> Я правильно понял, что размер 3D текстуры = размер карты и
> исходя из этого вычислить размер можно найдя минимальный и максимальный x, y, z
> на уровне?
Да, только с учётом масштаба и смещения к нулю, ведь текстурная координата должна попасть в диапазон 0..1 вне зависимости от размера текстуры в пикселях.
3D текстурные координаты получаешь в вертексном шейдере:
tu = (x-MinX)*scale
zombihello
> чтобы сохранить объемную текстуру
> надо сохранить каждый такой слой?
Этот вариант годится. Можно просто бинарно сохранить в файл объём, но при сохранении послойно можно воспользоваться сжатыми форматами. В той демке карта рассчитывается при старте, поэтому она долго стартует. Сейчас я делаю из слоёв атлас и сохраняю в один PNG файл весь объём.
zombihello
> А можно подробнее как лайтмэп в 3D текстуру запихнуть
На практике необязательно именно в 3д текстуру. Можно хранить как разрезженное облако точек. За пределами уровня свет просчитывать не надо, к примеру.
g-cont
> Можно хранить как разрезженное облако точек.
А выборку как делать?
g-cont
> Можно хранить как разрезженное облако точек
Чем-то напоминает Irradiance Volume или он и есть? Но как по мне с 3д текстурами мороки меньше.
Кстати, а в каких играх подобный подход применялся (лайтмапы в 3д текстурах), чисто интересно.
Mikle
да так же как, в Quake3 - на CPU. Представить в виде регулярной сетки и находить ближайшее значение в пространстве. Хотя наверное в наше время имеет смысл хранить в такой сетке не значения освещённости, а маленькие такие однопиксельные кубемапы.
g-cont
Если сетка регулярная, то как раз и на GPU нет проблем. Я думал, ты предлагаешь вдали от объектом плотность понижать.
zombihello
> а в каких играх подобный подход применялся (лайтмапы в 3д текстурах), чисто интересно.
До сих пор думал, что это мой велосипед, хотя идея лежит на поверхности.
У Хумуса демка точно была.
Mikle
Я правильно понимаю, что 3д лайтмап лучше всего строить на GPU, ибо на CPU будет безумно долго. Как вы делаете у себя?
У меня в демке строится на CPU, причём в 1 поток на Visual Basic, где-то 5-10 секунд. Правда качество устраивает не очень, например, углы сильно затемняются.
На GPU, естественно, это можно сделать значительно быстрее, даже подняв качество.
zombihello
Стандартные лайтпробы Юнити, не?
Тема в архиве.