Войти
ПрограммированиеФорумГрафика

Irradiance map generator

#0
18:51, 11 июля 2018

Добрый вечер!
Была поставлена задача - навернуть в существующий проект ibl с целью получения более реалистичного эмбиента и, возможно, отказа от некоторых источников света, заданных аналитически.
Технологию реализовал. Теперь встал вопрос о получении irradiance и Specular кубомап по развёртке окружения. Тим-лид сказал воспользоваться утилитой IBLBaker. На общих картах окружения даёт неплохой результат, да и настройки можно крутить. Попробовал в качестве окружения взять просто однотонную кубомапу с нарисованным в неё маленьким источником. В итоге irradiance получился с шумом:( Стал копать, почему так? Как выяснилось, при генерации irradiance идёт цикл по верхней полусфере(для рассчитываемого пиксела) с заданным смещением угла. В связи с этим в районе маленьких, но интенсивных источников получается шум. Так как для одного пиксела мы можем попасть в этот источник, а для соседнего уже можем не попасть. Или попасть другое число раз. Стал копать статьи.
https://learnopengl.com/PBR/IBL/Diffuse-irradiance
Здесь точно такой же алгоритм.
Вопрос: Почему для offline расчета нельзя пройтись по всем пикселям верхней полусферы кубомапы, а не идти с заданным шагам?
Есть готовые утилиты, которые рассчитывают качественные irradiance, Specular кубомапы?


#1
(Правка: 20:28) 20:28, 11 июля 2018

Есть очень быстрый способ, притом разницы с брутфорсом почти нет - сгенерировать стандартным способом мипмапы, а затем для каждого уровня roughness лучи швырять не по хайресной кубмапе, а по уже одному из даунсемпленных мипов. То бишь большой рафнес - читаешь там из 32х32, маленький - из хайреса.
Писал как-то заметки: https://ndotl.wordpress.com/2015/03/07/pbr-cubemap-filtering/
Шойдыр к ним: https://github.com/playcanvas/engine/blob/master/src/graphics/pro… rCubemap.frag

#2
(Правка: 20:42) 20:42, 11 июля 2018

Mr F
> а затем для каждого уровня roughness лучи швырять не по хайресной кубмапе, а по
> уже одному из даунсемпленных мипов. То бишь большой рафнес - читаешь там из
> 32х32, маленький - из хайреса.
Irradiance - он для диффузки. А если диффузка делается ламбертом (что вероятнее всего так), то какой рогнесс?

AMM1AK
> Была поставлена задача - навернуть в существующий проект ibl с целью получения
> более реалистичного эмбиента и, возможно, отказа от некоторых источников света,
> заданных аналитически.
Запечь гармоники будет пореалистичнее я думаю. А вообще Cubemapgen может генерить Irradiance : https://seblagarde.wordpress.com/2012/06/10/amd-cubemapgen-for-ph… ed-rendering/

#3
20:43, 11 июля 2018

Mr F
Это для specular, как я понял?
Я про diffuse говорил. Со specular такой проломы нет, она проще строится)

#4
20:51, 11 июля 2018

Протупил. Ну в любом случае, и для дифузных гармоник я сперва жму кубмапу в 32х32, а потом по каждому пикселю прохожусь, а то уснуть можно. Код тащил из выше указанного кубмапгена.

#5
5:51, 12 июля 2018

Mr F
> Есть очень быстрый способ, притом разницы с брутфорсом почти нет -
> сгенерировать стандартным способом мипмапы, а затем для каждого уровня
> roughness лучи швырять не по хайресной кубмапе, а по уже одному из
> даунсемпленных мипов. То бишь большой рафнес - читаешь там из 32х32, маленький
> - из хайреса.
так делает мармосет. а вообще самый дешёвый способ (хоть и немного фейк) — это всё то же самое, только обходиться ещё и всегда одним зеркальным лучом.

#6
14:29, 18 июля 2018

MrShoor
CubemapGen то что нужно, спасибо! Ibl взлетел:) правда он, зараза, на cpu походу считает. Уж очень долго..

#7
(Правка: 15:27) 15:27, 18 июля 2018

cubemapgen — говно мамонта, уже давно не поддерживается. cmft/cmftStudio — лучше, мощнее, современнее, открыты исходники. умеет OpenCL.

#8
15:43, 18 июля 2018

Suslik
У cubemapgen тоже открыты исходники. Но мне аж интересно стало, чем именно cmft/cmftStudio лучше, мощнее и современнее по части генерации irradiance map? Расскажи.

#9
(Правка: 15:59) 15:55, 18 июля 2018

MrShoor
да просто когда запускаешь одно и запускаешь другое, неужели у тебя ещё какие-то вопросы остаются? cmft поддерживает батчинг через командную строку, поддерживает миллион разных форматов кубмап с возможностью конвертировать всё во всё, поддерживает все мыслимые форматы на выходе, включая экзотические вроде rgb32f dds с мипами и dx11 хедером, миллион настроек фильтрации кубмапы для разных моделей освещения, нормальная превьюилка. есть ещё куча мелочей, о которых даже не задумываешься, пока не понадобится применить на деле — например, есть возможность не трогать нулевой мип для сохранения его чёткости, есть возможность гамму применять(причём раздельно указать гамму при чтении и при записи), есть возможность считать параллельно на CPU и GPU, можно генерить кубмапы без швов для убогого dx9, который не умеет между фейсами интерполировать, исходники написаны нормально, в них чёрт ногу не сломит и у проекта нет зависимостей, так что пересобрать самому — дело 5 минут.

короче, моё основное впечатление по cmft — на каждый чих, который можно хотеть, оказывается, уже есть ключ командной строки. видно, что в него вносилось огромное количество мелких изменений, чтобы покрыть все возможные юзкейсы.

моя единственная претензия к нему — он написан на брутальном plain C со всеми вытекающими. в нём может иногда где-то биться память и успехов её среди void* без смартпойнтеров найти.

#10
16:01, 18 июля 2018

Suslik
Понятно, в контексте генерирования irradiance map у cmft только одно преимущество: можно сгенерировать через командную строку.

ПрограммированиеФорумГрафика