I am implementing fresnel reflections for materials in my renderer.
Does it make sense for metals?
Here my implementation:
float BlinnPhong(const DistributionFunction::SampleInput& input, float shininess)
{
const float normalizationFactor = (shininess + 8.0f) * Math::InvPi8.getValue();
return std::pow(input.HoN, shininess) * normalizationFactor;
}
float ComputeFresnel0(float ior)
{
return std::powf((ior - 1.0f) / (ior + 1.0f), 2.0f);
}
float ComputeFresnel(float F0, float HoV)
{
return F0 + (1.0f - F0) * pow(1.0f - HoV, 5.0f);
}
// Here: the sampling function.
RGBFColor SampleMetalBrdf(const DistributionFunction::SampleInput& sampleInput)
{
static const float ior = 1.5f;
const float F0 = ComputeFresnel0(ior);
const float fresnel = ComputeFresnel(F0, sampleInput.HoV);
static const float shininess = 120.0f;
const float specularFactor = BlinnPhong(sampleInput, shininess);
static const RGBFColor baseColor = RGBFColor(1.0f);
return baseColor * specularFactor * fresnel * sampleInput.NoL; // Multiply by distSampleInput.NoL here for purpose.
}