I am using Schlick approximation to calculate the value of the Fresnel effect I found here
When I try to find corner cases for the formula I get the value of 1 when the angle between normal and viewing direction is 90° and 0,02 for 0° (I am using IOR 1 and 1.33). This means that when looking, for example, at a sphere its edges will reflect almost all of the light and its center will reflect just 2% of light.
But he doesn't make sense for me when I try to use it in the microfacet model for BRDF.
This means that the reflectance when looking directly from above on the surface will be just 2% which is unrealistically low. 98% of the energy would be absorbed by the surface. So just after 3 bounces, the ray would transmit less than 0,0008% of the light. This would darken an image and I would have to increase its emitted light by a great amount.
Am I thinking in a bad way about it?
My second idea what that it means how much light is directly reflected as a perfect reflection without being scattered my microfacet to other directions. The rest is used for diffuse/glossy reflection. But I cannot find any evidence for it anywhere.
Or I don't simply have to use Fresnel when I am dealing with non-transparent materials.
UPDATE:
This is my code for now.
//Position of intersection is world space
float3 hitpoint = ray.origin + ray.direction * ray.distance;
//Direction towards camera
float3 wo = -ray.direction;
//Geometry normal
float3 N = ray.worldNormal;
//Microfacet normal
float3 H = SampleMicrofacetNormal(roughness, &N, &ray);
//New direction of ray
float3 wi;
// Add light emitted from surface
ray.color += ray.mask * emission;
float F = Fresnel(&H, &wi);
float r1 = new_random(&ray.seed1);
if (r1 <= F) {
//Specular
//Reflected direction
float3 wi = reflect(&H, &wo);
float D = D_ggx(roughness, &N, &H);
float G = G_CookTorrance(roughness, &N, &H, &wo, &wi);
float weight = fabs(dot(wo, H)) / fabs(dot(N, wo) * dot(N, H));
//Not using F because it is already taken into a count by
//the probability of this IF/ELSE statement
float reflectance = G * weight;
ray.mask *= reflectance;
//Check - new direction cannot point towards surface
if (dot(wi, N) < 0) ray.mask = (float3)(0.0, 0.0, 0.0);
}
else {
//Diffuse
//Ray change color because light to through the material
ray.mask *= color;
//New random direction of diffuse ray
wi = SampleDiffuseCosineWeighted(&N, &ray);
//Importance sampling weight
ray.mask *= dot(wi, N);
}
//Set new direction and position for next tracing
ray.direction = wi;
ray.origin = hitpoint + N * EPSILON;