Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #version 120
- //uniform sampler2D albedo_map;
- //uniform sampler2D normal_map;
- //uniform sampler2D metallic_map;
- //uniform sampler2D roughness_map;
- //uniform sampler2D ao_map;
- uniform vec3 albedo;
- uniform vec3 normal;
- uniform float metallic;
- uniform float roughness;
- uniform float ao;
- varying vec3 v_normal;
- varying vec3 v_pos;
- #define PI 3.14159265359
- float GGXDistribution(float NdotH, float roughness)
- {
- float a = roughness*roughness; // Disney's reparameterization for roughness
- float a2 = a*a;
- float denom = NdotH*NdotH * (a2 - 1.0) + 1.0;
- denom = PI * denom * denom;
- return a2 / denom;
- }
- float SchlickGGXGeometry(float NdotV, float roughness)
- {
- float r = roughness + 1.0;
- float k = (r*r) * 0.125;
- return NdotV / (NdotV * (1.0 - k) + k);
- }
- float SmithGeometry(float NdotV, float NdotL, float roughness)
- {
- return SchlickGGXGeometry(NdotV, roughness)*SchlickGGXGeometry(NdotL, roughness);
- }
- vec3 SchlickFresnel(float cosTheta, vec3 F0)
- {
- return F0 + (1.0 - F0) * pow(2.0, (-5.55473*cosTheta-6.98316)*cosTheta);
- }
- void main()
- {
- vec3 lightColor = vec3(23.47, 21.31, 20.79);
- vec3 radiance = lightColor; // No attenuation
- vec2 texCoords = gl_TexCoord[0].st;
- //vec3 albedo = pow(texture2D(albedo_map, texCoords).rgb, vec3(2.2));
- //float metallic = texture2D(metallic_map, texCoords).r;
- //float roughness = texture2D(roughness_map, texCoords).r;
- //float ao = texture2D(ao_map, texCoords).r;
- vec3 N = normalize(v_normal);
- // Assuming directional light source
- vec3 V = -normalize(v_pos);
- vec3 L = normalize(gl_LightSource[0].position.xyz);
- vec3 H = normalize(V + L);
- float NdotL = max(dot(N, L), 0.0);
- float NdotV = max(dot(N, V), 0.0);
- float NdotH = max(dot(N, H), 0.0);
- float D = GGXDistribution(NdotH, roughness);
- float G = SmithGeometry(NdotV, NdotL, roughness);
- // Most dielectric surfaces look visually correct with a constant F0 of 0.04.
- // For metallic surfaces F0 is given by the albedo.
- vec3 F0 = vec3(0.04);
- F0 = mix(F0, albedo, metallic);
- // Use halfway vector instead of normal to avoid strong fresnel highlights
- vec3 F = SchlickFresnel(max(dot(H, V), 0.0), F0);
- vec3 specular = (D * G * F) / (4 * NdotV * NdotL + 0.001);
- // Metallic surfaces don't have diffuse reflections
- vec3 kD = (vec3(1.0) - F) * (1.0 - metallic);
- vec3 Lo = vec3(0.0);
- Lo += (kD * albedo / PI + specular) * radiance * NdotL;
- vec3 ambient = vec3(0.03) * albedo * ao;
- vec3 color = ambient + Lo;
- // Reinhard tone mapping
- color = color / (color + vec3(1.0));
- // Gamma correction
- color = pow(color, vec3(1.0/2.2));
- gl_FragColor = vec4(color, 1.0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement