Хотелось бы обсудить кое что о лайтпамах и долгих компиляциях. Ещё с тех пор как я только ознакомился с процессом создания карт для сталкера и ничего не понимал в программировании, мне было интересно, почему для статики рассчитываются лайтмапы десятками часов на центральном процессоре, и в довольно низком разрешении, а на динамике видеокарта успевает производить по нескольку десятков кадров в секунду с гораздо более чёткими тенями, создаваемыми каждый раз с нуля. Неужели нельзя ГПУ запрячь для создания статических лайтмапов из шадовмапов? Я думаю это было бы гораздо быстрее чем считать их на процессоре. И нет, я сейчас не про всякие там куды-хуюды, опенкл и прочую нехристь, я именно про самый обычный рендеринг.
Вот к примеру как запекает свет xrLC: там есть функция LightPoint, которая вычисляет освещённость точки в пространстве. Сначала освещённость принимается равной нулю, потом перебираются все источники света, при помощи рейтресинга делается проверка есть ли препятствие между точкой и источником, и если препятствия нет к освещённости прибавляется какое-то число.
Можно ли с помощью рендеринга есть препятствие между точкой и источником? Конечно можно! Именно так работает шадоу-маппинг. Что для этого нужно? Нарисовать сцену с видом из точки источника, для точечных источников, или всю сцену целиком под определённым углом, для источников направленных. Потом трансформировать координаты нашей точки в экранное пространство и сравнить Z с глубиной из Z-buffer'а. Если Z больше, то точка чем-то перекрыта, препятствие есть, освещённость не прибавляется.
Самый смак в том, что видеокарта рендерит обычно не одну точку. Нарисовав сцену в разрешении 1024x1024 можно заменить при удачном раскладе до миллиона с копейками проверок пересечений луча на центральном процессоре, и это миллисекунды, в отличии от.
Конечно такой подход требует серьёзных архитектурных изменений, тут нужно перебирать все освещаемые точки для источника, а не источники для точки, но это задача решаемая, благо количество этих самых точек известно (равно количеству пикселей в лайтмапе), у каждой есть своя позиция, всё можно вычислить, что и делается при обычном запекани лайтмапов.
А теперь внимание вопрос, почему так никто не делал? Рендерить чцену и получать zbuffer можно уже очень давно, однако поиск по запросам типа "lightmap calculation with gpu" ничего толкового мне не выдаёт, как будто никто даже не пытался такое воплотить никогда. В чём смертельный недостаток такого метода? Вроде же должно работать.