Advertisement
bigPasteGuy99

shader.frag

Jan 18th, 2022
1,272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #version 330 core
  2. out vec4 FragColor;
  3.  
  4. #define NR_POINT_LIGHTS 4
  5.  
  6. in vec3 FragPos;
  7. in vec3 Normal;
  8. in vec2 TexCoords;
  9.  
  10. struct Light
  11. {
  12.     vec3 position;
  13.     vec3 color;
  14. };
  15.  
  16. uniform Light lights[4];
  17. uniform vec3 v; //not passed in
  18. //uniform float roughness;
  19. uniform sampler2D diffuseTex;
  20. uniform sampler2D roughnessTex;
  21. uniform sampler2D metalnessTex;
  22. uniform bool useTex;
  23.  
  24. float DistributionGGX(vec3 N, vec3 H, float a)
  25. {
  26.     a = a * a; //adding because apparently roughness should be squared according to disney and epic
  27.     float a2, NdotH, NdotH2, num, denom;
  28.     a2 = a * a;
  29.     NdotH = max(dot(N, H), 0.0f);
  30.     NdotH2 = NdotH * NdotH;
  31.  
  32.     num = a2;
  33.     denom = 3.14159 * pow((NdotH2 * (a2 - 1) + 1), 2.0f);
  34.     return num / denom;
  35. }
  36.  
  37. //normal, view, and roughness alpha
  38. float GeometrySchlickGGX(vec3 N, vec3 v, float a)
  39. {
  40.     a = a * a; //adding because apparently roughness should be squared according to disney and epic
  41.     float k, NdotV;
  42.     k = pow(a + 1, 2) / 8.0f; //remaps differently if we do IBL --- becomes (a^2)/2
  43.     NdotV = max(dot(N, v), 0.0f);
  44.  
  45.     return NdotV / (NdotV * (1 - k) + k);
  46. }
  47.  
  48. //normal, view, light (to/from surface) and alpha
  49. float GeometrySmith(vec3 N, vec3 v, vec3 l, float a)
  50. {
  51.     a = a * a; //adding because apparently roughness should be squared according to disney and epic
  52.     return GeometrySchlickGGX(N, v, a) * GeometrySchlickGGX(N, l, a);
  53. }
  54.  
  55. //incidence angle (from dot product of normal and halfway vector, index of refraction
  56. float FresnelSchlick(float VdotH, float ior)
  57. {
  58.     float F0 = pow((ior - 1) / (ior + 1), 2.0f);
  59.     //float F0 = .04;
  60.     return F0 + (1.0 - F0) * pow(clamp(1.0 - VdotH, 0.0f, 1.0f), 5.0);
  61. }
  62.  
  63. float Attenuate(vec3 lightPos, vec3 surface)
  64. {
  65.     return 1.0f / pow(length(lightPos-surface), 2.0f);
  66. }
  67.  
  68. float Radiance(vec3 surface, vec3 lightPos, vec3 N)
  69. {
  70.     vec3 wi = normalize(lightPos - surface);
  71.     float cosTheta = max(dot(N, wi), 0.0f);
  72.     float attenuation = Attenuate(lightPos, surface);
  73.     return attenuation * cosTheta;
  74. }
  75.  
  76. void main()
  77. {
  78.  
  79.     vec3 l = normalize(lights[0].position - FragPos);
  80.     vec3 H = normalize(l + v);
  81.     float roughness = texture(roughnessTex, TexCoords).x;
  82.     float metalness = texture(metalnessTex, TexCoords).x;
  83.  
  84.     vec3 N = normalize(Normal);
  85.     if(!useTex)
  86.     {
  87.         roughness = .7f;
  88.         float metalness = .04;
  89.     }
  90.  
  91.     float fader = 250.0f;
  92.     float pi = 3.14159;
  93.     vec3 num;
  94.     float D, G, f, denom;
  95.    
  96.    
  97.     D = DistributionGGX(N, H, roughness);
  98.     G = GeometrySmith(N, v, l, roughness);
  99.  
  100.     //confused here. learnopengl said use H (which seems to fix problem) but textbook uses view direction. Very strange
  101.     f = FresnelSchlick(max(dot(H, N), 0.0f), metalness); //NO LONGER TRUE: dir and normal from textbook, learnopengl also uses halfway in place of dir and I think that's wrong
  102.  
  103.     vec3 F = vec3(f);
  104.     num = D * G * F;
  105.     denom = 4.0f * max(dot(N, v), 0.0f) * max(dot(N, l), 0.0f) + .0001f; //adding teeny term at the end so we don't divide by zero
  106.     vec3 spec = num / denom;
  107.  
  108.     vec3 kS, kD;
  109.     kS = F;
  110.     kD = vec3(1.0f) - kS;
  111.  
  112.     vec3 radiance = fader * lights[0].color * Attenuate(lights[0].position, FragPos);
  113.     float NdotL = max(dot(N, l), 0.0f);
  114.  
  115.     vec3 Lo = (kD * vec3(texture(diffuseTex, TexCoords)) / pi + spec) * radiance * NdotL;
  116.    
  117.     //vec3 Lo = (kD * vec3(1.0f, 0.0f, .2f) / pi + spec) * radiance * NdotL;
  118.  
  119.     FragColor = vec4(Lo, 1.0f);
  120.  
  121.  
  122. }
  123.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement