基于物理的渲染:环境光在 BRDF 中的作用
Physically Based Rendering: role of ambient light in 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);
我的问题:我将环境光增加了 2 倍。计算环境颜色时为 1x,将其添加到进入 BRDF 的光量时为 1x。
我不知道这是否正确,因为在我看来 BRDF 需要环境光,因为它是到达表面的照明的一部分。但另一方面,它已经通过将其与反照率颜色相乘并添加为基色来计算...
非常感谢任何帮助!
正确的公式是这样的(在我看来):
vec3 辐照度 = sunDiffuseRadiance * NdotL;
我想弄清楚我的 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);
我的问题:我将环境光增加了 2 倍。计算环境颜色时为 1x,将其添加到进入 BRDF 的光量时为 1x。
我不知道这是否正确,因为在我看来 BRDF 需要环境光,因为它是到达表面的照明的一部分。但另一方面,它已经通过将其与反照率颜色相乘并添加为基色来计算...
非常感谢任何帮助!
正确的公式是这样的(在我看来):
vec3 辐照度 = sunDiffuseRadiance * NdotL;