-
Notifications
You must be signed in to change notification settings - Fork 16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
rtx: physically correct emissive textures remaster #267
Comments
Попробую собрать с масками и посмотреть:
Возможно, даже с 1 она должна принимать свет, но это надо пробовать. |
Сделяль: #274 |
@w23 маски ты молодец что сделал и я думаю они пригодятся, но они не решают данные проблемы.
|
Далее вопрос между делом, у нас https://github.com/w23/xash3d-fwgs/blob/vulkan/ref_vk/vk_ray_model.c#L400-L402 подразумеваются эмиссивные материалы? то есть потенциально я смогу ещё загрузить карту для свечения? (хотя по идее то же самое решается через маску где серая зона пол силы источника света), но для моделей это бы было хорошая штука где нельзя задать свечение иначе. |
Теперь ещё раз по первому пункту: Смешивание происходит так что на выходе у нас серный цвет вместо белого
|
Для теста сделал без всяких условий:
Куда же пропал белый? Возможно это немного поможет, если я делают так:
|
Муторно пробежавшись по отчасти запутанному коду понял что ты это рисуешь как out_additive.
в ray.rgen где
Всё это убивает глубину. Теперь вопрос где kusok.emissive рассчитывается? |
Залил test_gradient #33 (comment) |
Давай определимся сначала, какого мы хотим добиться эффекта. Например, варианты:
Варианты (1 и 2) нефизичные, надо специально хачить: . Будет выглядеть криво: поверхности рядом с источником света ненатурально яркие по сравнению с самим источником. В целом, я считаю что у меня проблемы с:
Я предлагаю:
|
А, да, про additive: канал additive существуе только для того, чтобы добавлять цвет без шумодава и перемножения. Потому что у нас есть отдельно каналы альбедо и шумного освещения диффузов со спекулярами. Они шумодавятся и перемножаются друг на друга, тогда как аддитив просто добавляется, как есть (перед тонмаппингом, кончено). Это корректный способ добавить эмиссив, потому что он не имеет отношения к диффузоспекулярному освещению. |
Так из-за чего additive был серым? если убрать тонемаппинг серость не уходит. Где это настраивается?
Красивого. Ну по возможности в рамках правдоподобного. План такой:
Для отладки надо:
Просто нельзя исключать что kusok.emissive содежит в себе значения не пригодные для пространства payload.emissive, что нормализация тут лишь маскирующий костыль и недостаточна, а возможно нужно ещё пропустить через какую-то кривую-коррекции, потому что сейчас даже после нормализации низкие значения слишком сильны и предварительно они сильнее чем то что я получаю на наколеночном тесте, но тут ещё мешает беда с 1 пунктом, поэтому пержде чем подходить к 2 нужно исправить 1 пункт плана. Без масок мы действительно никуда не денемся, но для масок нам нужен блум эффект, иначе невозможно это оценивать даже с художественной точки зрения (не говоря уж о физ корректности). Сейчас сделаю ещё одну сцену (test_light5) где у нас будут комнаты для отладки всего этого. В целом мне нужны крутилки, тогда бы я мог выкрутить освещение согласно всем тестам при этом не сломав игру. |
Добавил в \valve\luchiki\maps\c1a0.bsp.patch:
Загрузился с #274 на c0a0. Half-Life.2021-12-11.19-06-11.mp4Поэтому у меня есть сомнения на тему правильности вклада kusok.emissive. |
Вот так будет соответствовать примерно base_color без освещения, но с убитой глубиной.
А вот так на глаз ожидаемый свет от такой яркости текстуры как на видео. Причём если я задам значение из rad файла:
я получу ещё ярче текстуру. То есть то что в раде и то что в патче почему-то отличается при одних и тех же значениях. |
Обнаружил интересную особенность.
Вполне себе корректное поведение! (за исключением проблемы глубины текстуры) |
а. А где у нас лежит test_light4? в #33 его нет. |
Действительно, он туда не попал, я его только в конфу заливал. |
Насколько я понял, это ты просто замаскировал проблему. Завтра сделаю карту где будет не только белый, но и случай с обычной текстурой. |
Там точно какой-то проёб, но я пока не понимаю, какой именно. Как с этим связано небо я пока вообще не понимаю. |
Это уже 4 проблема помимо payload.emissive, kusok.emissive, анимационные текстуры.
Ниже можно не читать, я вначале не до конца разобрался и наличие тонемаппига сбило с толку, оставляю просто для истории.
|
Поговорим о связи двух багов с payload.emissive и kusok.emissive и чуть больше о их природе на эмпиричном примере. Загрузился в бранч emissive-mask, открутил aces_tonemap в denoiser.comp (вначале забыл 😿 и результаты получились не те и я сделал не правильные выводы, теперь переписываю всё это) это важно!, запустил test_gradient, перешёл в режим только света, отредактировал rad файл чтобы белый там был белым (255,255,255) если взять пипеткой с экрана.
При этом градиенты выглядят практически как надо, точка белого на градиенте становится 254. Чтобы разобраться с kusok.emissive для начала надо починить расчёт треугольников, возможно это автоматом это починит, но в целом нарастание происходит гораздо быстрее чем ожидается и внутри payload.emissive надо как-то по особому готовить kusok.emissive а не просто умножать на него. Прикладываю дополнительно результаты полученные при тонемаппинге (если не заметно этот пункт можно раскрыть, много текста).
Под конец белый очень тяжело рос, разница между 254 и 255 довольно большая. 255 получилось так:
Если задать 204 будет 254, а само 254 начинается с 145, причём что интересно получается 254 254 253! Откуда там 253? со 146 оно становится равномерно 254. На 143 равномерно 253 253 253. При 255 255 255 kusok.emissive градиент сломан.
Но в то же время есть проблема с payload.emissive, его смешивание работает примерно таким образом: точка чёрного остаётся на 0 0 0 и на 205 светимости, а вот все остальные градации градиента очень сильно зависят от подложки (kusok.emissive), при 205 когда белый 255 на градиенте вся остальная градация была пересвечена, при 3 когда белый 126 недосвечена (потому что крайний белый берётся от подложки). Тонемаппинг в текущей реализации ломает белый на эммисив текстурах. Вот тест на небе: То есть победа! Предлагаю:
|
Если подумать то там 255 * 10 = 2550, но |
В настоящий момент payload.emissive где
Допустим надо чтобы из рада 255 255 255 1 = 1 1 1 в payload.emissive и на экране 255 255 255.
Сделает полностью закрашенную текстуру, а при 1 она будет 1 1 1. |
|
Сегодня чудным образом быстро разобрался в проблеме, но тут надо сказать ещё спасибо @MaxG2D так как после его бранча #302 до меня начало доходить как надо решать эту проблему. Итак, у нас есть 3 слоя вклада света (световой пирог) + 4 слой бонуса.
const vec3 base_color = ((push_constants.flags & PUSH_FLAG_LIGHTMAP_ONLY) != 0) ? vec3(1.) : tex_color.rgb;
payload.hit_pos_t = vec4(hit_pos + geom_normal * normal_offset_fudge, gl_HitTEXT); который нас ведёт в ray.rgen в sampleSurfaceTriangle.
Чтобы получить очень похожий на qrad вид я сделал так: const vec3 base_color = vec3(0.);
payload.emissive = vec3(0.); // для бранча emissive-mask (не тестировал на нём) в ray.rgen: color /= pdf / 10; Но это без текстур! Сейчас попробую добиться чтобы текстуры восстановить. |
Возвращаю payload.emissive = kusok.emissive * emissive_color;
...
colour *= 0.25;
colour = reinhard02(colour, vec3(25.)); Это не идеально, как видно стал неправильный скайбокс (убирание pow не сильно улучшает ситуацию), а ещё на уровне неправильная яркость у поинтлайтов. |
Чтобы сделать с правильной яркостью надо: const float hack_attenuation = 1.f;
const float hack_attenuation_spot = 1.f; |
Резюмирую, проблема была в TWO_PI вместо PI в pdf. Кроме этого точечные источники света надо делить на 2, там видимо тоже где-то TWO_PI или типа того, надо поискать будет. |
This comment has been minimized.
This comment has been minimized.
Всё здесь довольно сильно устарело. |
Currently we'll draw emissive surfaces similar to how it operates for original renderer:
More physically correct path tracer would have the same color sample value for both direct hit and emissive light ray samples. That required emissive texture remaster though:
Lighting code would then need to properly sample this:
The text was updated successfully, but these errors were encountered: