106 lines
2.7 KiB
GLSL
106 lines
2.7 KiB
GLSL
#version 330 core
|
|
|
|
struct Light {
|
|
vec3 direction;
|
|
vec3 ambient;
|
|
vec3 diffuse;
|
|
vec3 specular;
|
|
};
|
|
|
|
out vec4 FragColor;
|
|
|
|
in vec3 frag_normal;
|
|
in vec3 fragPos;
|
|
in vec4 frag_pos_light_space;
|
|
|
|
uniform sampler2D shadow_map;
|
|
uniform vec3 viewPos;
|
|
|
|
uniform float perceptualRoughness; // [0, 1]
|
|
uniform float metallic; // [0, 1]
|
|
uniform float reflectance; // [0, 1]
|
|
uniform vec3 baseColor;
|
|
|
|
uniform Light light;
|
|
|
|
float shadow_factor(vec4 frag_pos_light_space)
|
|
{
|
|
vec3 proj_coords = frag_pos_light_space.xyz / frag_pos_light_space.w;
|
|
proj_coords = proj_coords * 0.5 + 0.5;
|
|
|
|
float closest_depth = texture(shadow_map, proj_coords.xy).r;
|
|
float current_depth = proj_coords.z;
|
|
|
|
float bias = 0.005;
|
|
float shadow = 0;
|
|
vec2 delta = 1.0 / textureSize(shadow_map, 0);
|
|
for (int i = -1; i < 2; i++)
|
|
for (int j = -1; j < 2; j++) {
|
|
float closest_depth = texture(shadow_map, proj_coords.xy + vec2(i, j) * delta).r;
|
|
shadow += (current_depth - bias > closest_depth) ? 1.0 : 0.0;
|
|
}
|
|
shadow /= 9;
|
|
return shadow;
|
|
}
|
|
|
|
float D_GGX(float NoH, float a) {
|
|
float a2 = a * a;
|
|
float f = (NoH * a2 - NoH) * NoH + 1.0;
|
|
return a2 / (PI * f * f);
|
|
}
|
|
|
|
vec3 F_Schlick(float u, vec3 f0) {
|
|
return f0 + (vec3(1.0) - f0) * pow(1.0 - u, 5.0);
|
|
}
|
|
|
|
float V_SmithGGXCorrelated(float NoV, float NoL, float a) {
|
|
float a2 = a * a;
|
|
float GGXL = NoV * sqrt((-NoL * a2 + NoL) * NoL + a2);
|
|
float GGXV = NoL * sqrt((-NoV * a2 + NoV) * NoV + a2);
|
|
return 0.5 / (GGXV + GGXL);
|
|
}
|
|
|
|
float Fd_Lambert() {
|
|
return 1.0 / PI;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
// NOTE: frag_normal is normalized by the vertex shader
|
|
/*
|
|
vec3 l = normalize(light.direction);
|
|
vec3 v = viewDir;
|
|
vec3 n = frag_normal;
|
|
vec3 h = normalize(v + l);
|
|
vec3 diffuseColor = (1.0 - metallic) * baseColor.rgb;
|
|
vec3 f0 = 0.16 * reflectance * reflectance * (1.0 - metallic) + baseColor * metallic;
|
|
|
|
float NoV = abs(dot(n, v)) + 1e-5;
|
|
float NoL = clamp(dot(n, l), 0.0, 1.0);
|
|
float NoH = clamp(dot(n, h), 0.0, 1.0);
|
|
float LoH = clamp(dot(l, h), 0.0, 1.0);
|
|
|
|
float roughness = perceptualRoughness * perceptualRoughness;
|
|
|
|
float D = D_GGX(NoH, roughness);
|
|
vec3 F = F_Schlick(LoH, f0);
|
|
float V = V_SmithGGXCorrelated(NoV, NoL, roughness);
|
|
|
|
// specular BRDF
|
|
vec3 Fr = (D * V) * F;
|
|
|
|
//vec3 energyCompensation = 1.0 + f0 * (1.0 / dfg.y - 1.0);
|
|
//// Scale the specular lobe to account for multiscattering
|
|
//Fr *= pixel.energyCompensation;
|
|
|
|
// diffuse BRDF
|
|
vec3 Fd = diffuseColor * Fd_Lambert();
|
|
|
|
// apply lighting...
|
|
|
|
float shadow = shadow_factor(frag_pos_light_space);
|
|
*/
|
|
vec3 result = vec3(1, 0, 0); // Fd + Fr * (1 - shadow);
|
|
FragColor = vec4(result, 1.0);
|
|
}
|