Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. float Square(in float x) { return x * x; }
  2.  
  3. float Theta(in vec3 w)
  4. {
  5.     return acos(w.z / length(w));
  6. }
  7.  
  8. float CosTheta(in vec3 w)
  9. {
  10.     return cos(Theta(w));
  11. }
  12.  
  13. float EricHeitz2018GGXG1Lambda(in vec3 V, in float alpha_x, in float alpha_y)
  14. {
  15.     float Vx2 = Square(V.x);
  16.     float Vy2 = Square(V.y);
  17.     float Vz2 = Square(V.z);
  18.     float ax2 = Square(alpha_x);
  19.     float ay2 = Square(alpha_y);
  20.     return (-1.0 + sqrt(1.0 + (Vx2 * ax2 + Vy2 * ay2) / Vz2)) / 2.0;
  21. }
  22.  
  23. float EricHeitz2018GGXG1(vec3 V, float alpha_x, float alpha_y)
  24. {
  25.     return 1.0 / (1.0 + EricHeitz2018GGXG1Lambda(V, alpha_x, alpha_y));
  26. }
  27.  
  28. // wm: microfacet normal in frame
  29. float EricHeitz2018GGXD(in vec3 N, in float alpha_x, in float alpha_y)
  30. {
  31.     float Nx2 = Square(N.x);
  32.     float Ny2 = Square(N.y);
  33.     float Nz2 = Square(N.z);
  34.     float ax2 = Square(alpha_x);
  35.     float ay2 = Square(alpha_y);
  36.     return 1.0 / (PI * alpha_x * alpha_y * Square(Nx2 / ax2 + Ny2 / ay2 + Nz2));
  37. }
  38.  
  39. float EricHeitz2018GGXG2(in vec3 V, in vec3 L, in float alpha_x, in float alpha_y)
  40. {
  41.     return EricHeitz2018GGXG1(V, alpha_x, alpha_y) * EricHeitz2018GGXG1(L, alpha_x, alpha_y);
  42. }
  43.  
  44. vec3 EricHeitz2018GGX(in vec3 V, in vec3 L, in float roughness, in float anisotropic, in float ior)
  45. {
  46.     float alpha = roughness * roughness;
  47.     float aspect = sqrt(1.0 - 0.9 * anisotropic);
  48.     float alpha_x = alpha * aspect;
  49.     float alpha_y = alpha / aspect;
  50.  
  51.     vec3 H = normalize(L + V);
  52.     float NoV = CosTheta(V);
  53.     float NoL = CosTheta(L);
  54.     if (NoV < 0.0 || NoL < 0.0) return vec3(0);
  55.  
  56.     float VoH = dot(V, H);
  57.     float NoH = CosTheta(H);
  58.     vec3 F0 = vec3(abs((1.0 - ior) / (1.0 + ior)));
  59.     F0 = F0 * F0;
  60.  
  61.     float D = EricHeitz2018GGXD(H, alpha_x, alpha_y);
  62.     vec3 F = SchlickFresnel(max(NoV, 0.0), F0);
  63.     float G = EricHeitz2018GGXG2(V, L, alpha_x, alpha_y);
  64.     return (F * D * G) / (4.0f * VoH * NoH);
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement