Войти
Urho3DФорумРАССКАЖИТЕ ПРО ВАШИ ПРОЕКТЫ

Демо графических возможностей движка. (118 стр)

Страницы: 1114 115 116 117 118 119 Следующая »
#1755
18:36, 7 апр. 2021

ёж
> Смысл в том, что диффуз уже может содержать детали, помимо цвета и не нуждатся
> в калькуляции.

Разница только в том что если взять объект отсканированный в одном окружении и поместить в другое то он будет смотреться несколько не к месту.
Изображение

PBR помогает учитывать рассеяное освещение от объектов вокруг через reflection probe. Как ковёр дома у Чувака - That rug really tied the room together.


#1756
21:17, 7 апр. 2021

радио

ты бы мог не удалять неделю хотя бы свои сообщения? читать сложно, а у меня времени не так много, чтобы за день всё успеть :( просил же уже :(
#1757
(Правка: 21:38) 21:37, 7 апр. 2021

ёж
> В ПБР диффуз (альбедо) - это лишь часть чего-то, без чего его нельзя рендерить.
попробуй почитать, что тебе пишут:
> примером такого шейдера может быть, например, чистый ламберт, который является сильным упрощением, но при этом является совершенно корректной аппроксимацией, поэтому может называться PBR.
ламберт сам по себе (диффуз) — вполне себе PBR, просто сильно ограниченный.

> По старинке, но применили ко всем объектам шейдер металла (эксперимент какой-то)
> За такое убивать надо и голову отрубать :)
> А ПБР говорит: все есть металл и все есть спекуляр и все есть куча всего другого.
то есть по-твоему сказать, что кирпичи сделаны из металла имеет под собой какие-то физические основания? какое отношение подобный шлак имеет к PBR вообще? я тебе больше скажу — если что-то выглядит не реалистично, это значит, что оно по определению не является нормальным PBR.

#1758
23:47, 7 апр. 2021
радио
в следующий раз возьми ник пук - такой же мимолетный
#1759
9:46, 8 апр. 2021

Suslik
> ламберт сам по себе (диффуз) — вполне себе PBR

когда нужно делить на пи или нет?

#1760
(Правка: 11:08) 11:05, 8 апр. 2021

innuendo
в BRDF делится на pi, потом интегрируется по полусфере (телесный угол 2*pi) и pi сокращается, а двойка уходит из-за косинуса под интегралом. правильный ламберт — это просто albedo_color * light_color * max(0, dot(n, l)) и больше ничего. а вот куда попало вшлёпывать pi (с последующей подгонкой ассетов под это) — это классический не-PBR.

#1761
11:16, 8 апр. 2021

Suslik
> телесный угол 2*pi

можно посмотреть это на картинке ?

#1762
(Правка: 11:30) 11:28, 8 апр. 2021

innuendo
> можно посмотреть это на картинке ?
телесный угол сферы — это 4pi. поэтому полусферы — это 2pi. просто интеграл по полусфере — это, соответственно, тоже 2*pi.
далее смотрим на уравнение рендеринга:
Изображение
под интегралом считаем L единицей (равномерное освещение со всех сторон), f() — какой-то неизвестной константой, остаётся только скалярное произведение, то есть косинус. интеграл косинуса по полусфере — это pi. из физических соображений если идеально диффузный белый объект (альбедо 1) освещён белым светом со всех сторон (L равна единице для всех направлений), результирующий интеграл должен быть равен единице, поэтому f должна быть равна 1/pi. используя эту константу, можно посчитать интеграл для направленного источника (L — дельта-функция), получается просто косинус.

#1763
(Правка: 12:20) 12:06, 8 апр. 2021

до меня только после написания предыдущего поста дошло, откуда вообще этот вопрос про pi возникает. путаница в том, что pi на самом деле в 2х местах: один в brdf ламберта (1/pi) а второй — в финальной формуле освещённости (1/pi). так вот я предыдущим постом объяснил валидность первого множителя — он там необходим, чтобы энергия сохранялась. однако, если по-честному сделать этот шаг:

> используя эту константу, можно посчитать интеграл для направленного источника (L — дельта-функция), получается просто косинус.
то там как раз получится что-то в духе:
1/pi * albedo_color * light_color * max(0, dot(n, l))

то есть с одной стороны можно сказать, что да —  если под light_color понимать L, то действительно, нужно 1/pi. однако, в реальности под light_color понимают величину L/pi. обращу внимание, что это — совершенно законная операция, но только в случае, если тот же самый light_color используется и в спекуляре. нет особой разницы, что именно понимать под светимостью источника — саму L или L/pi, главное, чтобы это было одинаково во всём пайплайне.

"но сусличек, у меня же тут стенакода написана, которая уже 10 лет работает, как мне быстро проверить, всё ли в ней правильно?"
и для этого есть простой хак: если у тебя используется 1/pi в диффузе, это нормально, но в твоём GGX/Ward тогда тоже должен быть 1/pi в результате. если у тебя в диффузе просто косинус без множителя, это тоже нормально, но тогда нигде в формулах спекуляра у тебя не должно быть pi.

подтверждение этому можно найти, например, тут: https://neil3d.github.io/assets/pdf/s2013_pbs_epic_notes_v2.pdf
у них используется 1/pi в диффузе (1), но у них также сидит 1/pi в функции распределения (3)

у обоих подходов есть преимущества. если делить на pi, то легко составить соотвествие между цветом источников и их светимостью. если не использовать pi, то художники знают, что свет интенсивности 1 даст ровно белый цвет на самом ярком участке диффузной поверхности с альбедо 1.

#1764
12:19, 8 апр. 2021

Suslik
> так вот я предыдущим постом объяснил валидность первого множителя — он там
> необходим, чтобы энергия сохранялась.

как ты думаешь, я просто так от балды спросил про пи?

#1765
12:40, 8 апр. 2021

Suslik
> нет особой разницы, что именно понимать под светимостью источника — саму L или
> L/pi, главное, чтобы это было одинаково во всём пайплайне.
У меня довольно много боли было с этим pi, и я не уверен, что я все сделал правильно.
Стыдно признавать, но я часто действовал наугад, пытаясь подогнать результаты, особенно в лайтмаппере.

Ну то есть окей, вот это я нагло спер из Fillament-a:
https://github.com/rokups/rbfx/blob/ek/renderer/bin/CoreData/Shad… RDF.glsl#L115
И убрал деление на пи и в D_GGX, и в Fd_Lambert.

Но вот тут я добавил умножение на пи просто потому, что мне показалось, что так правильнее:
https://github.com/rokups/rbfx/blob/ek/renderer/Source/Urho3D/Glo… acer.cpp#L466
Что самое тупое, конкретно для этого места у меня нет никакого референса. Это место отвечает за яркость вторичных отражений при запекании (и за яркость светящихся материалов), а я хер знает какая у них должна быть яркость. Мне показалось, что эмиссия слишком тусклая, и я добавил множитель. Но что если я должен был добавить множитель в эмиссию?..

Вот хрен знает, белые и красные блики на полу — слишком яркие, или как надо?
Screenshot 2021-04-08 123837 | Демо графических возможностей движка.

#1766
14:55, 8 апр. 2021

Eugene
> Но вот тут я добавил умножение на пи просто потому, что мне показалось, что так правильнее:
жесть.

точечные источники и направленные на самом деле сложнее тестить, чем area light'ы (включая вторичное освещение), потому что у первых все интегралы вырождаются из-за дельта функций, которые с реальной яркостью связаны произвольными множителями, которые реально можно определить произвольным образом (отсюда и косяки с 1/pi). однако, вторичное освещение наоборот тестить проще, потому что в нём всё можно достаточно легко верифицировать и проверить.

например, если ты считаешь вторичное освещение, то можешь сделать инвертированный куб, поставить внутрь камеру, одной стенке назначить диффузный цвет (альбедо) = 1, а трём другим стенкам назначь нулевой альбедо и светимость, например, (0.42, 0, 0). так как любой луч, ударившийся в белую стенку, будет обязан отразиться в одну из красных стенок, а у них у всех одинаковая светимость, то белая стенка должна будет иметь финальный цвет ровно (0.42, 0, 0).

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

#1767
(Правка: 15:00) 14:59, 8 апр. 2021

ещё пример: если в тёмной комнате на белом полу (albedo=1) поставить куб с зелёной светимостью (emissive=(0, 1, 0)), то непосредственно рядом с кубом на полу должен быть цвет ровно (0, 0.5, 0), потому что там ровно половина полусферы имеет светимость (0, 1, 0), а вторая половина — (0, 0, 0), поэтому результат получается половинный. я смотрю на твой зелёный куб там на заднем плане и у него, вроде, никак не сходится с этой величиной, то есть вклад от светимости должен быть больше.

PS ясное дело, все значения цвета я указываю в линейном пространстве. если в пейнте колорпикером читать цвет на скриншоте, нужно не забывать делать ^2.2, чтобы получить обратно линейное значение из sRGB (я надеюсь, он у вас есть).

#1768
(Правка: 15:22) 15:21, 8 апр. 2021

Suslik
> а создать сцену, для которой ты сам можешь предсказать в голове результат и по
> ней сравниваться.
Я так подгонял сферические гармоники, ну и прямое освещение. Я определил "яркость фона" как "цвет белых матовых объектов в этом фоне", ну и "яркость света" как "цвет перпендикулярной белой поверхности", и дальше уже смотрел так, чтобы цвета сошлись.

> например, если ты считаешь вторичное освещение, то можешь сделать
> инвертированный куб, поставить внутрь камеру, одной стенке назначить диффузный
> цвет (альбедо) = 1, а трём другим стенкам назначь нулевой альбедо
Я пытался сделать что-то очень похожее, только с двумя плоскостями.
Типа, одна плоскость белая, другая светится заданным цветом, плоскости очень близко друг к другу и большие.
Значит ли это, что освещение белой плоскости в центре должно совпадать с этим цветом?
Потому что оно — нет, даже когда я в Юнити решил повторить этот тест.

#1769
15:57, 8 апр. 2021

Suslik
> у обоих подходов есть преимущества. если делить на pi, то легко составить
> соотвествие между цветом источников и их светимостью
Значит ли это, что излучающая поверхность, которая визуально имеет цвет Х, будет светить с яркостью X/pi? И если я возьму бесконечную emissive плоскость цвета (0, 0.5, 0), параллельная ей бесконечная плоскость с белым альбедо будет иметь цвет (0, 0.16, 0)? В линейном пространстве цветов ессно.

Страницы: 1114 115 116 117 118 119 Следующая »
Urho3DФорумРАССКАЖИТЕ ПРО ВАШИ ПРОЕКТЫ