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

куки-торренсы (3 стр)

Страницы: 1 2 3
#30
15:40, 15 авг. 2020

Стал проверять energy conservation и обнаружил что BRDF возвращает значения больше 1 при источнике света (1,1,1) что физически невозможно. Обнаружил, что D term > 1 если используется распределение Бекманна или Блинн-Фонга:
cook_torrance_D | куки-торренсы
Из-за этого spec * NdotL > 1. Возникает вопрос что с этим делать? Наверное надо клампить, или BRDF получается излучает больше чем принимает.


#31
16:05, 15 авг. 2020

v1c
> Стал проверять energy conservation и обнаружил что BRDF возвращает значения больше 1 при источнике света (1,1,1) что физически невозможно.

Какбы тебе объяснить, точка светит 1,1,1 но это точка, и поток света на точку пространства при приближении к ней стремится в бесконечность. Так что это вполне правильно для представления источника света в виде точки.

Посмотри скрины что я кидал, как видишь там тоже больше 1.

У тебя как-то странно шейдер багует на значениях больше 1.

#32
17:01, 15 авг. 2020

samrrr
Похоже D > 1 это нормально, нашёл вот:

Unlike F(), the value of D() is not restricted to lie between 0 and 1—although values must be non-negative, they can be arbitrarily large (indicating a very high concentration of surface points with normals pointing in a particular direction).

Background: Physics and Math of
Shading
#33
17:15, 15 авг. 2020

v1c
Не читай древние сайты, там такую чушь можно найти...

#34
(Правка: 17:42) 17:41, 15 авг. 2020

Думаю я в конце-концов нашёл как считать trade-off между diffuse term и specular term:

There are various approaches to model this trade-off, from simple (multiplying the diffuse term by one minus the Fresnel factor), to more complex and accurate approaches [2, 3, 41, 65].

По второй ссылке у нас An Anisotropic Phong Light Reflection Model где приводится формула 14 для рассчёта diffuse term. Если переложить её на GLSL, получается такой код:
float pow5(float x)
{
    return pow(x, 5.);
}

vec3 diffuseTerm(vec3 albedo, vec3 f0, vec3 n, vec3 l, vec3 v)
{
    return (28. * albedo)/(23. * PI) * (1. - lum(f0)) * (1. - pow5(1. - dot(n, l)/2.)) *
                                                        (1. - pow5(1. - dot(n, v)/2.));
}

Rd у них альбедо, Rs - is material’s reflectance for the normal incidence, т. е. F0.
Rd = (1-F)/4 * albedo как я предположил - некорректное, везде где я смотрел для ламбертиана идёт деление на Pi.

Страницы: 1 2 3
ПрограммированиеФорумГрафика