Физически обоснованный рендеринг: роль окружающего света в 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;