Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const float pi = 3.1415926535897932384626433832795f;
- const float epsilon = 0.001f;
- float sqr(float x)
- {
- return x * x;
- }
- vec3 Lighting()
- {
- vec3 viewDirection = normalize(cameraPosition - worldPosition);
- vec3 irradiance = vec3(0.0f);
- for (int i = 0; i < scene.lightsCount; i++)
- {
- Light light = lights.lights[i];
- vec3 lightDirection = light.position - worldPosition;
- float distance = length(lightDirection);
- lightDirection /= distance;
- float att0 = min(distance, light.radius);
- float att = sqr(1.0 - sqr(sqr(att0 / light.radius))) / (sqr(att0) + 1.0);
- vec3 H0 = normalize(lightDirection + viewDirection);
- float NoH = max(0.0f, dot(normal, H0));
- float NoV = max(0.0f, dot(normal, viewDirection));
- float NoL = max(0.0f, dot(normal, lightDirection));
- float HoV = max(0.0f, dot(H0, viewDirection));
- vec3 F0 = mix(vec3(0.04f), colour, metallic);
- vec3 F = F0 + (vec3(1.0f) - F0) * pow(1.0f - HoV, 5.0f);
- vec3 kS = F;
- vec3 kD = (vec3(1.0) - kS) * (1.0f - metallic);
- float D0 = sqr(sqr(roughness));
- float D = D0 / (sqr(sqr(NoH) * (D0 - 1.0f) + 1.0f) * pi);
- float k = sqr(roughness + 1.0f) / 8.0f;
- float ggx_v = NoV / (NoV * (1.0f - k) + k);
- float ggx_l = NoL / (NoV * (1.0f - k) + k);
- float G = ggx_v * ggx_l;
- vec3 specular = kS * D * G / (4.0f * NoL * NoV + epsilon);
- vec3 diffuse = kD * colour * (1.0f / pi);
- vec3 L0 = (diffuse + specular) * NoL;
- vec3 radiance = light.colour.rgb * att;
- irradiance += radiance * L0;
- }
- return irradiance;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement