Физически обоснованный рендеринг: роль окружающего света в BRDF

Я пытаюсь выяснить, правильный ли мой подход BRDF или нет.

// Calculate sun BRDF color
vec3 sunBrdf = brdf(tsLightSourceDir, tsEyeDir,
                    tsNormal, vtsTangent, vtsBinormal,
                    albedo.rgb,
                    NdotL, NdotV,
                    tRoughness, tMetallic, specular);

// brdf multiplied by incoming sun radiance -> color
vec3 irradiance = sunAmbientRadiance + sunDiffuseRadiance * NdotL;
vec3 brdfColor  = sunBrdf * irradiance;

// Add base ambient color
vec3 ambientColor = albedo.rgb * sunAmbientRadiance;
resultColor = ambientColor;

resultColor += brdfColor;

// Interpolate by shadow
resultColor = mix(ambientColor,
                  resultColor,
                  shadowAmount);

Мой вопрос: я добавляю рассеянный свет 2x. 1x при расчете окружающего цвета и 1x путем добавления его к количеству света, поступающего в BRDF.

Я не могу понять, правильно ли это или нет, так как BRDF нуждается в окружающем освещении, по моему мнению, так как это часть освещения, которое выходит на поверхность. Но с другой стороны, он уже рассчитан путем умножения его на цвет альбедо и добавления в качестве основного цвета...

Любая помощь высоко ценится!

1 ответ

Решение

Правильная формула выглядит так (по моему мнению):

vec3 irradiance = sunDiffuseRadiance * NdotL;

Другие вопросы по тегам