Advertisement
mattparks5855

Vulkan PBR Lighting

Nov 26th, 2017
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const float pi = 3.1415926535897932384626433832795f;
  2. const float epsilon = 0.001f;
  3.  
  4. float sqr(float x)
  5. {
  6.     return x * x;
  7. }
  8.  
  9. vec3 Lighting()
  10. {
  11.     vec3 viewDirection = normalize(cameraPosition - worldPosition);
  12.     vec3 irradiance = vec3(0.0f);
  13.    
  14.     for (int i = 0; i < scene.lightsCount; i++)
  15.     {
  16.         Light light = lights.lights[i];
  17.            
  18.         vec3 lightDirection = light.position - worldPosition;
  19.         float distance = length(lightDirection);
  20.         lightDirection /= distance;
  21.            
  22.         float att0 = min(distance, light.radius);
  23.         float att = sqr(1.0 - sqr(sqr(att0 / light.radius))) / (sqr(att0) + 1.0);
  24.  
  25.         vec3 H0 = normalize(lightDirection + viewDirection);
  26.         float NoH = max(0.0f, dot(normal, H0));
  27.         float NoV = max(0.0f, dot(normal, viewDirection));
  28.         float NoL = max(0.0f, dot(normal, lightDirection));
  29.         float HoV = max(0.0f, dot(H0, viewDirection));
  30.  
  31.         vec3 F0 = mix(vec3(0.04f), colour, metallic);
  32.         vec3 F = F0 + (vec3(1.0f) - F0) * pow(1.0f - HoV, 5.0f);
  33.  
  34.         vec3 kS = F;
  35.         vec3 kD = (vec3(1.0) - kS) * (1.0f - metallic);
  36.  
  37.         float D0 = sqr(sqr(roughness));
  38.         float D = D0 / (sqr(sqr(NoH) * (D0 - 1.0f) + 1.0f) * pi);
  39.  
  40.         float k = sqr(roughness + 1.0f) / 8.0f;
  41.         float ggx_v = NoV / (NoV * (1.0f - k) + k);
  42.         float ggx_l = NoL / (NoV * (1.0f - k) + k);
  43.         float G = ggx_v * ggx_l;
  44.  
  45.         vec3 specular = kS * D * G / (4.0f * NoL * NoV + epsilon);
  46.         vec3 diffuse = kD * colour * (1.0f / pi);
  47.  
  48.         vec3 L0 = (diffuse + specular) * NoL;
  49.         vec3 radiance = light.colour.rgb * att;
  50.         irradiance += radiance * L0;
  51.     }
  52.    
  53.     return irradiance;
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement