Advertisement
Dnurrr

Untitled

Jan 26th, 2025
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. PBR
  2. {
  3.     import "Lights.lesl"
  4.  
  5.     uniforms
  6.     {
  7.         // Camera
  8.         mat4 model;
  9.         mat4 view;
  10.         mat4 projection;
  11.         vec3 camPos;
  12.  
  13.         // Material
  14.         vec3 albedo;
  15.         float metallic;
  16.         float roughness;
  17.         float ao;
  18.         float alpha;
  19.  
  20.         // Lights
  21.         vec3 lightPositions[4];
  22.         vec3 lightColors[4];
  23.     }
  24.  
  25.     vertex
  26.     {
  27.         inputs
  28.         {
  29.            
  30.         }
  31.  
  32.         outputs
  33.         {
  34.             vec3 Normal;
  35.             vec3 WorldPosition;
  36.             vec2 UV;
  37.         }
  38.  
  39.         process
  40.         {
  41.             void main()
  42.             {
  43.                 Normal = normalize((model * vec4(aNormal, 0.0)).xyz);
  44.                 WorldPosition = (model * vec4(aPos, 1.0)).xyz;
  45.                 UV = aTexCoords;
  46.                 gl_Position = projection * view * model * vec4(aPos, 1.0);
  47.             }
  48.         }
  49.     }
  50.  
  51.     fragment
  52.     {
  53.         inputs
  54.         {
  55.             vec3 Normal;
  56.             vec3 WorldPosition;
  57.             vec2 UV;
  58.         }
  59.  
  60.         outputs
  61.         {
  62.             vec4 outColor;
  63.         }
  64.  
  65.         process
  66.         {
  67.             const float PI = 3.14159265359;
  68.  
  69.             float DistributionGGX(vec3 N, vec3 H, float roughness)
  70.             {
  71.                 float a = roughness * roughness;
  72.                 float a2 = a * a;
  73.                 float NdotH = max(dot(N, H), 0.0);
  74.                 float NdotH2 = NdotH * NdotH;
  75.  
  76.                 float nom = a2;
  77.                 float denom = (NdotH2 * (a2 - 1.0) + 1.0);
  78.                 denom = PI * denom * denom;
  79.  
  80.                 return nom / denom;
  81.             }
  82.  
  83.             float GeometrySchlickGGX(float NdotV, float roughness)
  84.             {
  85.                 float r = (roughness + 1.0);
  86.                 float k = (r * r) / 8.0;
  87.                 float nom = NdotV;
  88.                 float denom = NdotV * (1.0 - k) + k;
  89.  
  90.                 return nom / denom;
  91.             }
  92.  
  93.             float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
  94.             {
  95.                 float NdotV = max(dot(N, V), 0.0);
  96.                 float NdotL = max(dot(N, L), 0.0);
  97.                 float ggx2 = GeometrySchlickGGX(NdotV, roughness);
  98.                 float ggx1 = GeometrySchlickGGX(NdotL, roughness);
  99.  
  100.                 return ggx1 * ggx2;
  101.             }
  102.  
  103.             vec3 fresnelSchlick(float cosTheta, vec3 F0)
  104.             {
  105.                 return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
  106.             }
  107.  
  108.             void main()
  109.             {
  110.                 vec3 N = normalize(Normal);
  111.                 vec3 V = normalize(camPos - WorldPosition);
  112.  
  113.                 vec3 F0 = vec3(0.04);
  114.                 F0 = mix(F0, albedo, metallic);
  115.  
  116.                 vec3 Lo = vec3(0.0);
  117.  
  118.                 for(int i = 0; i < 4; i++)
  119.                 {
  120.                     vec3 L = normalize(lightPositions[i] - WorldPosition);
  121.                     vec3 H = normalize(V + L);
  122.                     float distance = length(lightPositions[i] - WorldPosition);
  123.                     float attenuation = 1.0 / (distance * distance);
  124.                     vec3 radiance = lightColors[i] * attenuation;
  125.  
  126.                     // Cook-Torrance BRDF
  127.                     float NDF = DistributionGGX(N, H, roughness);
  128.                     float G = GeometrySmith(N, V, L, roughness);
  129.                     vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0);
  130.  
  131.                     vec3 numerator = NDF * G * F;
  132.                     float denominator = 4.0 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0) + 0.001;
  133.                     vec3 specular = numerator / denominator;
  134.  
  135.                     vec3 kS = F;
  136.                     vec3 kD = vec3(1.0) - kS;
  137.                     kD *= 1.0 - metallic;
  138.  
  139.                     float NdotL = max(dot(N, L), 0.0);
  140.                     Lo += (kD * albedo / PI + specular) * radiance * NdotL;
  141.                 }
  142.  
  143.                 vec3 ambient = vec3(0.03) * albedo * ao;
  144.                 vec3 color = ambient + Lo;
  145.  
  146.                 // HDR tonemapping e gamma correction
  147.                 color = color / (color + vec3(1.0));
  148.                 color = pow(color, vec3(1.0/2.2));
  149.  
  150.                 Light light;
  151.                 light.color = vec3(1.0);
  152.                 light.position = lightPositions[0];
  153.                 light.intensity = 1.0;
  154.  
  155.                 outColor = vec4(ProcessLights(color, Normal, WorldPosition, light), alpha);
  156.             }
  157.         }
  158.     }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement